【发布时间】:2017-05-31 16:00:23
【问题描述】:
sqlalchemy.exc.IntegrityError: (pyodbc.IntegrityError) ('23000', '[23000] [FreeTDS][SQL Server]无法将显式值插入 时间戳列。将 INSERT 与列列表一起使用以排除 时间戳列,或将 D EFAULT 插入时间戳列。 (273) (SQLExecDirectW)') [SQL: 'INSERT INTO task_events (task_id, event_name, ts) OUTP UT inserted.id VALUES (?, ?, ?)'] [参数: (54, 'RUNNING', datetime.datetime(2017, 1, 16, 18, 5, 55, 595066))]
错误似乎与此有关:
You can't insert explicit values into a timestamp column.
Timestamp values are unique binary numbers that are automatically generated.
SQLAlchemy 不知道吗?是否有一些关键\设置让 SQLAlchemy 知道现在插入时间戳?
This 似乎是处理 SQLAlchemy 的 luigi 代码。
ps。这里的问题是 luigi 正在使用 SQLAlchemy,我不想修改 luigi 的代码,但是如果您可以在 luigi 方面提出一个简单的解决方案,那也可以。
【问题讨论】:
-
嗨,您能否发布导致此问题的代码 sn-p。一般来说,SqlAlchemy 只能在某些列上进行细粒度插入,但这里的解决方案取决于您的 luigi 代码如何与 sqlalchemy 交互,或者修改数据库模式以允许插入到
ts列中 -
尝试使用
FetchedValue。如果没有完整且可验证的示例,很难说更多。是什么提供了要插入的日期时间值? -
Microsoft SQL Server 的
timestamp数据类型实际上不是时间戳——它更像是一个序列(它是一个古老的保留,而且名字非常错误)。如果您需要更新日期时间值,请使用datetime数据类型。如果仅日期,请使用date数据类型(取决于您的 MSSQL 版本。)查看您的代码,您可能想要使用datetime2data type,例如DECLARE @dt2 datetime2(7) -
@LaughingVergil 就像我说的,如果可能的话,我不想碰 luigi 代码
-
如果正在创建的表是使用
timestamp数据类型创建的,恐怕没有办法解决。了解这些字段在 SQL Server 中本质上是不可更新的,并且没有技巧解决方法。最好的办法是将目标表上该列的数据类型更改为datetime2(7)或datetime,因为代码打算 是记录特定日期和时间。只是为了强调,没有允许代码更新 SQL Server 中的时间戳字段的解决方法 - 它只是自动生成的。
标签: python sql-server datetime sqlalchemy luigi