【问题标题】:SQLAlchemy returning strings instead of datetime objectsSQLAlchemy 返回字符串而不是日期时间对象
【发布时间】:2017-06-27 18:48:06
【问题描述】:

我正在使用 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 那个

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

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

【问题讨论】:

  • 使用mssql+pyodbc 而不是mssql+pymssql 重要吗?也许这是一个 ODBC 问题。我得到普通的datetime 对象使用它,基于相同的 FreeTDS。
  • @9000 我将连接字符串更改为mssql+pymssql://my_user:my_password@my_server/my_database,仍然得到与上述相同的结果。
  • 您的 Linux 机器是否在运行当前版本的 FreeTDS 和 SQLAlchemy?
  • 我这么认为? tsql -C | grep Version 打印 Version: freetds v0.91pip freeze | grep ^SQLAlchemy 打印 SQLAlchemy==1.1.5。不确定这些是否是相关的版本号。
  • @KrisHarper - SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='MyTable' AND COLUMN_NAME='AsOfDate' 说什么? (还记得“@ping”您的回复以通知对方。)

标签: python database datetime sqlalchemy freetds


【解决方案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 官方支持的配置。

【讨论】:

  • 感谢您提供有关 TDS 8.0 版的提示。我会一直坚持这一点。
  • 在 Ubuntu 18.04 上,使用 mssql+pymssql,我在执行 sudo apt install freetds-bin 后得到了这个工作。 tsql -C | grep Version 在本文发布时返回 freetds v1.00.82。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 2017-11-26
  • 2021-06-09
  • 2017-07-18
  • 2011-07-29
相关资源
最近更新 更多