【问题标题】:SQLAlchemy fails to insert timestamp into MSSQLSQLAlchemy 无法将时间戳插入 MSSQL
【发布时间】: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 版本。)查看您的代码,您可能想要使用 datetime2 data type,例如DECLARE @dt2 datetime2(7)
  • @LaughingVergil 就像我说的,如果可能的话,我不想碰 luigi 代码
  • 如果正在创建的表是使用timestamp 数据类型创建的,恐怕没有办法解决。了解这些字段在 SQL Server 中本质上是不可更新的,并且没有技巧解决方法。最好的办法是将目标表上该列的数据类型更改为datetime2(7)datetime,因为代码打算 是记录特定日期和时间。只是为了强调,没有允许代码更新 SQL Server 中的时间戳字段的解决方法 - 它只是自动生成的。

标签: python sql-server datetime sqlalchemy luigi


【解决方案1】:

因此,感谢@LaugingVergil 和@HaleemurAli 这些优秀的绅士,我刚刚决定在我的dockerfile 中添加另一个sed hack...

我只是在CMD /usr/bin/luigid之前做RUN sed -i 's/TIMESTAMP/DateTime/g' /usr/lib/python3.4/site-packages/luigi/db_task_history.py

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    相关资源
    最近更新 更多