2017-02-09 150 views
2

我正在使用SQLAlchemy連接到SQL Server數據庫。我查詢的表格有DATETIME列。在Windows上,SQLAlchemy對象上的結果屬性是Python datetime對象。在Linux上,它是一個字符串。SQLAlchemy返回字符串而不是日期時間對象

我的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:[email protected]_server/my_database?driver=SQL Server Native Client 11.0 

我猜這與FreeTDS驅動程序有關。雖然,SQLAlchemy documentation states

支持DATE和TIME。根據大多數MSSQL驅動程序的要求,綁定參數轉換爲 datetime.datetime()對象,並且如果需要,則從字符串處理 結果。日期和時間類型 不適用於MSSQL 2005和以前版本 - 如果檢測到低於2008的服務器版本 ,則這些類型的DDL將作爲 DATETIME發佈。

我該如何解決這個問題,以便Linux調用返回datetime對象?

+1

使用'mssql + pyodbc'而不是'mssql + pymssql'很重要嗎?也許這是一個ODBC問題。基於相同的FreeTDS,我使用正常的'datetime'對象。 – 9000

+0

@ 9000我將連接字符串更改爲'mssql + pymssql:// my_user:my_password @ my_server/my_database',我仍然得到與上面相同的結果。 –

+0

您的Linux機器是否運行合理的FreeTDS和SQLAlchemy最新版本? –

回答

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正式支持的配置。

+1

感謝關於TDS 8.0版的提示。我會一直堅持這一點。 –

相關問題