Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy和SQL Server日期时间字段溢出_Python_Sql Server_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy和SQL Server日期时间字段溢出

Python SQLAlchemy和SQL Server日期时间字段溢出,python,sql-server,sqlalchemy,Python,Sql Server,Sqlalchemy,我正在使用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) 。

我正在使用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到sqlserver的转换似乎没有将“0”添加到年初值。我可以使用带或不带前导“0”的INSERT语句将此日期手动添加到SQL Server,这一事实证实了这一点

是否有办法强制将日期的年份部分转换为正确的格式?或者这是由其他原因造成的

更新: 从中,我发现可以将列的类型指定为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表中相应的日期时间字段的类型为 日期时间2

SQL Alchemy是否仍然将该值构建为类型DATETIME,而不考虑目标表中的相应类型

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

另一个原因(似乎是问题的根源)与ODBC和DATETIME2有关:

早期的SQL Server ODBC驱动程序可以推断服务器类型 (datetime或smalldatetime)从刻度(必须为0或3) 因此可以比SQLServer2008本机客户端更轻松。这个 OdbcParameter的默认比例为0,因此早期的驱动程序可以 假设服务器类型必须为smalldatetime,并忽略任何分数 秒引入datetime2和用户定义的比例 介于0和7之间时,驱动程序无法再从 缩放并必须默认为最丰富的类型datetime2。当 实际服务器类型不是datetime2将有一个服务器端 从datetime2到实际服务器类型的转换。我为这件事道歉 这引起了你的牵连,但我们别无选择 新的行为被记录下来

因此,ODBC似乎从SQLServer2008版本开始,在内部更改了DATETIME2的比例

我建议遵循ODBC的建议,并从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)

我在数据库中使用datetime2,所以它应该能够记录214年。是的,它看起来像一个错误(可能是),但我仍然需要能够插入到数据库中。我的问题是datetime。datetime(214,7,21,0,0)是由sqlalchemy生成的,我想问是否有任何方法可以强制它使用四位数的年份值。因为我假设这就是db表需要的。我怀疑SLQAlchemy只是试图传递一个DATETIME值,而不是DATETIME2…可能就是这样,只需要知道如何更改它,在internet上找不到任何显示您可以更改的地方。我已用ODBC相关问题更新了我的答案。将我的连接字符串更改为connectionString='mssql+pyodbc://username:password@my_server/my_database_name?driver=SQL server本机客户端11.0“正常工作(我没有安装10.0,但有11.0)。谢谢你的帮助。很好的发现。这里至少还有一个关于ODBC处理日期/时间类型的问题的报告:那么我想做的是不可能的吗?我不能肯定。你控制SQL数据库了吗?然后你可以想象解决这个问题的选项。是的,我控制SQL数据库了。你控制了吗按照Alexander Volok的建议改为本机SQL server客户端?我相信这实际上可以解决问题。