【发布时间】:2019-07-14 08:03:59
【问题描述】:
我正在使用 SQLAlchemy 连接到 SQL Server 数据库。
我试图从我的 python 脚本中将一个对象插入到一个表中,但它失败了。我收到错误消息:
(pyodbc.DataError) ('22008', '[22008] [Microsoft][ODBC SQL Server Driver]Datetime field overflow (0) (SQLExecDirectW)')
看起来这是由以下日期时间对象引起的:
datetime.datetime(214, 7, 21, 0, 0)
...那是 214 年 7 月 21 日
SQL Server 表中对应的日期时间字段的类型为 datetime2。
看起来从 python/SQLAlchemy 到 SQL Server 的转换没有在年初值中添加“0”。我已经通过以下事实证实了这一点:我可以使用带有和不带前导“0”的 INSERT 语句手动将此日期添加到 SQL Server。
有没有办法将日期的年份部分强制转换为正确的格式?还是其他原因造成的?
更新: 从https://docs.sqlalchemy.org/en/latest/dialects/mssql.html 我发现您可以将列的类型指定为 DATETIME2(对于 MS SQL),并且我已经相应地更新了对象映射。
之前是这样的:
from base import Base
from sqlalchemy import Column, Integer, String, Numeric, DateTime
class Results(Base):
__tablename__ = 'Result'
dateTimeMinValue = Column(DateTime)
dateTimeMaxValue = Column(DateTime)
我现在将其更新为:
from base import Base
from sqlalchemy import Column, Integer, String, Numeric
from sqlalchemy.dialects.mssql import DATETIME2
class Results(Base):
__tablename__ = 'Result'
dateTimeMinValue = Column(DATETIME2)
dateTimeMaxValue = Column(DATETIME2)
但我仍然遇到和以前一样的错误。
【问题讨论】:
-
这里至少还有一份关于 ODBC 处理日期/时间类型问题的报告:developercommunity.visualstudio.com/content/problem/281326/…
-
那么我试图做的事情是不可能的吗?
-
我不能肯定。您可以控制 SQL 数据库吗?然后,人们可能会想方设法解决这个问题。
-
是的,我可以控制 SQL 数据库。
-
您是否按照 Alexander Volok 的建议更改为原生 SQL Server 客户端?我相信这实际上可以解决问题。
标签: python sql-server sqlalchemy