2017-02-09 15 views
2

SQLAlchemyを使用してSQL Serverデータベースに接続しています。私が照会しているテーブルにはDATETIMEの列があります。 Windowsでは、結果のSQLAlchemyオブジェクトの属性はPython datetimeオブジェクトです。 Linuxでは、文字列です。datetimeオブジェクトの代わりに文字列を返すSQLAlchemy

マイSQLAlchemyのクラスは、Windows上でこの

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 

のように見える、私はLinuxではこの

>>db.session.query(MyTable.as_of_date).first() 
datetime.datetime(2006, 11, 30, 0, 0) 

を取得し、私はこの

>>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を使用する必要があります。

(「8.0」というTDS_Versionに注意してください、それが7.3よりも新しいないあるので、実際にバージョン7.1のための単なる別名です参考:。。here

もちろん、あなたの他のオプションはFreeTDS_ODBCから切り替えることですMicrosoft ODBC Driver for SQL Server on Linuxにこれはpyodbcと組み合わせて、Microsoftによって正式にサポートされている構成です。

+1

TDSバージョン8.0に関するヒントをありがとう。私はしばらくそれに固執していたでしょう。 –

関連する問題