Kri*_*per 5 python database datetime sqlalchemy freetds
我正在使用 SQLAlchemy 连接到 SQL Server 数据库。我查询的表有一DATETIME
列。在 Windows 上,SQLAlchemy 对象上的结果属性是一个 Pythondatetime
对象。在 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
Run Code Online (Sandbox Code Playgroud)
在 Windows 上,我得到了这个
>>db.session.query(MyTable.as_of_date).first()
datetime.datetime(2006, 11, 30, 0, 0)
Run Code Online (Sandbox Code Playgroud)
在 Linux 上,我得到了这个
>>db.session.query(MyTable.as_of_date).first()
('2006-11-30 00:00:00.00000000',)
Run Code Online (Sandbox Code Playgroud)
我的连接字符串看起来像这样
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
Run Code Online (Sandbox Code Playgroud)
我猜这与 FreeTDS 驱动程序有关。虽然SQLAlchemy的文档状态是
支持日期和时间。大多数 MSSQL 驱动程序都要求将绑定参数转换为 datetime.datetime() 对象, 如果需要,则从字符串处理结果。DATE 和 TIME 类型不适用于 MSSQL 2005 和更早版本 - 如果检测到低于 2008 的服务器版本,这些类型的 DDL 将作为 DATETIME 发布。
我该如何解决这个问题,以便 Linux 调用返回datetime
对象?
问题在于该列实际上是 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 切换到Linux 上的 Microsoft ODBC Driver for SQL Server。与 pyodbc 结合起来,就是 Microsoft 官方支持的配置。