2017-02-09 162 views
2

我正在使用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对象?

+1

使用'mssql + pyodbc'而不是'mssql + pymssql'很重要吗?也许这是一个ODBC问题。基于相同的FreeTDS,我使用正常的'datetime'对象。 – 9000

+0

@ 9000我将连接字符串更改为'mssql + pymssql:// my_user:my_password @ my_server/my_database',我仍然得到与上面相同的结果。 –

+0

您的Linux机器是否运行合理的FreeTDS和SQLAlchemy最新版本? –

回答

1

问题是该列实际上是DATETIME2(而不是DATETIME),并且Linux盒安装了FreeTDS 0.91。为了使FreeTDS完全支持DATETIME2列,您需要运行FreeTDS 0.95或更高版本,并使用TDS协议版本7.3或7.4。

(请注意,TDS_Version“8.0”实际上只是7.1版本的别名,所以它是出现不到7.3参考:。here

当然,你的其他选择是从FreeTDS_ODBC切换到Microsoft ODBC Driver for SQL Server on Linux。这与pyodbc结合,是一种由Microsoft正式支持的配置。

+1

感谢关于TDS 8.0版的提示。我会一直坚持这一点。 –

相关问题