我正在使用SQLAlchemy连接到SQL Server数据库。我查询的表格有DATETIME
列。在Windows上,SQLAlchemy对象上的结果属性是Python datetime
对象。在Linux上,它是一个字符串。SQLAlchemy返回字符串而不是日期时间对象
我的SQLAlchemy类看起来像这样
class MyTable(Model):
id_ = db.Column('Id', db.Integer, primary_key=True, index=True)
as_of_date = db.Column('AsOfDate', db.DateTime, nullable=False, server_default=db.FetchedValue())
# Other columns
在Windows上,我得到这个
>>db.session.query(MyTable.as_of_date).first()
datetime.datetime(2006, 11, 30, 0, 0)
在Linux上,我得到这个
>>db.session.query(MyTable.as_of_date).first()
('2006-11-30 00:00:00.00000000',)
我的连接字符串看起来像这样
Linux
mssql+pyodbc:///?odbc_connect=DRIVER={FreeTDS};Server=my_server;Port=1433;Database=my_database;UID=my_user;PWD=my_password;TDS_Version=8.0;
Windows
mssql+pyodbc://my_user:[email protected]_server/my_database?driver=SQL Server Native Client 11.0
我猜这与FreeTDS驱动程序有关。虽然,SQLAlchemy documentation states即
支持DATE和TIME。根据大多数MSSQL驱动程序的要求,绑定参数转换为 datetime.datetime()对象,并且如果需要,则从字符串处理 结果。日期和时间类型 不适用于MSSQL 2005和以前版本 - 如果检测到低于2008的服务器版本 ,则这些类型的DDL将作为 DATETIME发布。
我该如何解决这个问题,以便Linux调用返回datetime
对象?
使用'mssql + pyodbc'而不是'mssql + pymssql'很重要吗?也许这是一个ODBC问题。基于相同的FreeTDS,我使用正常的'datetime'对象。 – 9000
@ 9000我将连接字符串更改为'mssql + pymssql:// my_user:my_password @ my_server/my_database',我仍然得到与上面相同的结果。 –
您的Linux机器是否运行合理的FreeTDS和SQLAlchemy最新版本? –