【发布时间】: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.91和pip 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