在sql alchemy datetime中插入null



我正在进行迁移,其中我有一个表a,我将其拆分为表B和表C。我的(简化的)迁移脚本是:

from alembic import op
con = op.get_bind()
items = con.execute("SELECT * FROM public.A")
for item in items:
B_id = item.b
C_id = item.c
some_attributes = item.some_attributes
some_other_attributes = item.some_other_attributes
created_at = item.created_at
updated_at = created_at
if item.deleted:             
deleted_at = created_at
else:
deleted_at = created_at     # This should be None

op.execute("INSERT INTO B (id, some_attributes, created_at, updated_at, deleted_at)
VALUES ('{}','{}','{}','{}','{}')
ON CONFLICT DO NOTHING".format(B_id, some_attributes, created_at, updated_at, deleted_at))
op.execute("INSERT INTO C (id, some_other_attributes ,created_at, updated_at, deleted_at, B_id)
VALUES ('{}','{}','{}','{}','{}','{}')".format(C_id,some_other_attributes,created_at,updated_at,deleted_at,B_id))

目前,这是可行的,但问题是,当我的项目没有被删除时,我希望我的deleted_at设置为NULL。问题是,如果我将值设置为None、"NULL""null"甚至sqlalchemy.sql.null(),我会得到以下错误:

sqlalchemy.exc.DataError: (psycopg2.errors.InvalidDatetimeFormat) invalid input syntax for type timestamp: "NULL"

我的列是可以为null的,我可以通过在ifitem.deleted语句中复制我的代码来做我想做的事情,当我想将其设置为null时,不提及deleted _at列,但这一点都不优雅。

我也可以从我的模型中导入A、B和C,每次都创建一个B和C的新实例,然后添加并提交每个实例到我的会话中,但这需要我更改B和C初始化代码,而仅仅为了迁移而这样做对我来说是错误的。

有人知道我的想法吗?告诉我是否需要编辑任何内容以添加精确性。

我终于用这种方法做到了:

我也可以从我的模型中导入A、B和C,每次都创建一个B和C的新实例,然后添加并提交每个实例到我的会话中,但这需要我更改B和C初始化代码,而仅仅为了迁移而这样做对我来说是错误的。

但我没有更改B和C的初始化代码,而是这样做了:

b = B(some_attributes,created_at)
b.deleted_at = deleted_at
session.add(b)
session.commit()

最新更新