SQLAlchemy 返回字符串而不是日期时间对象
SQLAlchemy returning strings instead of datetime objects
我正在使用 SQLAlchemy 连接到 SQL 服务器数据库。我正在查询的 table 有一个 DATETIME
列。在 Windows 上,SQLAlchemy 对象的结果属性是 Python datetime
对象。在 Linux 上,它是一个字符串。
我的SQL炼金术class看起来像这样
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 驱动程序有关。虽然,SQL炼金documentation states那个
DATE and TIME are supported. Bind parameters are converted to
datetime.datetime() objects as required by most MSSQL drivers, and
results are processed from strings if needed. The DATE and TIME types
are not available for MSSQL 2005 and previous - if a server version
below 2008 is detected, DDL for these types will be issued as
DATETIME.
如何解决这个问题,以便 Linux 调用 return 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 更新。参考:here .)
当然,您的另一个选择是从 FreeTDS_ODBC 切换到 Microsoft ODBC Driver for SQL Server on Linux。那个,结合pyodbc,是微软官方支持的配置。
我正在使用 SQLAlchemy 连接到 SQL 服务器数据库。我正在查询的 table 有一个 DATETIME
列。在 Windows 上,SQLAlchemy 对象的结果属性是 Python datetime
对象。在 Linux 上,它是一个字符串。
我的SQL炼金术class看起来像这样
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 驱动程序有关。虽然,SQL炼金documentation states那个
DATE and TIME are supported. Bind parameters are converted to datetime.datetime() objects as required by most MSSQL drivers, and results are processed from strings if needed. The DATE and TIME types are not available for MSSQL 2005 and previous - if a server version below 2008 is detected, DDL for these types will be issued as DATETIME.
如何解决这个问题,以便 Linux 调用 return 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 更新。参考:here .)
当然,您的另一个选择是从 FreeTDS_ODBC 切换到 Microsoft ODBC Driver for SQL Server on Linux。那个,结合pyodbc,是微软官方支持的配置。