问题描述
我正在使用 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
支持日期和时间。 大多数 MSSQL 驱动程序都要求将绑定参数转换为 datetime.datetime() 对象,如果需要,则从字符串处理结果。 DATE 和 TIME 类型不适用于 MSSQL 2005 和更早版本 - 如果检测到低于 2008 的服务器版本,这些类型的 DDL 将作为 DATETIME 发布。
我该如何解决这个问题,以便 Linux 调用返回datetime
对象?
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 更新。参考:。)
当然,您的另一个选择是从 FreeTDS_ODBC 切换到 。 那个,结合pyodbc,是微软官方支持的配置。