SQLAlchemy返回字符串而不是datetime对象

时间:2017-02-09 16:38:33

标签: python database datetime sqlalchemy freetds

我正在使用SQLAlchemy连接到SQL Server数据库。我正在查询的表格有一个DATETIME列。在Windows上,SQLAlchemy对象上的结果属性是Python datetime对象。在Linux上,它是一个字符串。

我的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:my_password@my_server/my_database?driver=SQL Server Native Client 11.0

我猜这与FreeTDS驱动程序有关。虽然,SQLAlchemy documentation states表示

  

支持日期和时间。绑定参数转换为   datetime.datetime()对象是大多数MSSQL驱动程序所需的,和   如果需要,结果将从字符串中处理。 DATE和TIME类型   不适用于MSSQL 2005和之前的版本 - 如果是服务器版本   检测到2008年以下,这些类型的DDL将被发布为   DATETIME。

如何解决这个问题,以便Linux调用返回datetime个对象?

1 个答案:

答案 0 :(得分:1)

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

(请注意,TDS_Version&#34; 8.0&#34;实际上只是版本7.1的别名,因此 比7.3更新.Ref:https://github.com/narainsagar/node-casperjs-aws-lambda。)< / p>

当然,您的另一个选择是从FreeTDS_ODBC切换到here。与pyodbc结合使用,是Microsoft正式支持的配置。