当前位置: 代码迷 >> python >> SQLAlchemy 返回字符串而不是日期时间对象
  详细解决方案

SQLAlchemy 返回字符串而不是日期时间对象

热度:72   发布时间:2023-06-13 14:08:38.0

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

问题是该列实际上是 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,是微软官方支持的配置。