SQLalchemy和SQL Server DateTime字段溢出



我正在使用sqlalchemy连接到SQL Server数据库。

我试图将对象插入我的python脚本中的表中,但失败了。我正在收到错误:

(pyodbc.DataError) ('22008', '[22008] [Microsoft][ODBC SQL Server Driver]Datetime field overflow (0) (SQLExecDirectW)')

看起来这是由以下DateTime对象引起的:

datetime.datetime(214, 7, 21, 0, 0)

...那是214年7月21日

SQL Server表中的相应日期时间字段是类型DateTime2。

看起来从Python/SQLalchemy到SQL Server的转换并未在年初值中添加" 0"。我已经通过以下情况确认了这一事实,即我可以使用和不带有领先的" 0"。

手动添加此日期。

是否有一种方法可以将日期的一年迫使该年份成为正确的格式?还是这是由其他事物引起的?

更新: 从https://docs.sqlalchemy.org/en/latest/dialect/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)

,但我仍然遇到与以前相同的错误。

SQL Server表中的相应日期时间字段是类型 datetime2。

可以是SQL Alchemy仍然将该值构建为类型DateTime,而无需考虑目标表中的相应类型?

DateTime T-SQL:

日期范围: 1753年1月1日至9999年12月31日:

另一个原因,似乎是问题的根源,与ODBC和DateTime2:错误22008:DateTime字段通过ODBC插入DateTime2字段插入记录时溢出

SQL Server早期的ODBC驱动程序可以推断服务器类型 (DateTime或SmallDateTime)从秤(必须为0或3) 因此,可能比SQL Server 2008本机客户端更轻松。这 ODBCPARAMETER的默认标度为0,因此早期的驱动程序可以 假设服务器类型必须是SmallDateTime,并且忽略任何分数 秒。引入DateTime2和用户定义的比例 在0到7之间,驾驶员不能再从 比例,必须默认为最富有的类型DateTime2。当。。。的时候 实际服务器类型不是DateTime2,将有服务器端 从DateTime2转换为实际服务器类型。我道歉 这给您带来了不可感知的能力,但是我们别无选择, 新行为已记录。

因此,ODBC似乎从发行版SQL Server 2008开始,内部更改DateTime2的量表。

我建议遵循此线程的建议,然后从ODBC切换到本机SQL Server客户端:

import sqlalchemy as sql
connectionString = 'mssql+pyodbc://username:password@my_server/my_database_name?driver=SQL Server Native Client 10.0'
engine = sql.create_engine(connectionString)

最新更新