2017-02-09 2 views
2

Ich verwende SQLAlchemy, um eine Verbindung zu einer SQL Server-Datenbank herzustellen. Die Tabelle, die ich abfrage, hat eine Spalte. Unter Windows ist das resultierende Attribut für das SQLAlchemy-Objekt ein Python-Objekt datetime. Unter Linux ist es eine Zeichenfolge.SQLAlchemy Rückgabezeichenfolgen anstelle von Datetime-Objekten

Meine SQLAlchemy Klasse sieht wie folgt aus

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 

Unter Windows bekomme ich diese

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

Unter Linux bekomme ich diese

>>db.session.query(MyTable.as_of_date).first() 
('2006-11-30 00:00:00.00000000',) 

Meine Verbindungszeichenfolgen wie folgt aussehen

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 

Ich vermute, das hat etwas mit dem FreeTDS-Treiber zu tun. Obwohl SQLAlchemy documentation states, dass

DATUM und ZEIT werden unterstützt. Bind-Parameter werden in datetime.datetime() - Objekte konvertiert, wie von den meisten MSSQL-Treibern benötigt, und Ergebnisse werden bei Bedarf von Strings verarbeitet. Die Typen vom Typ DATE und TIME sind nicht für MSSQL 2005 und früher verfügbar. Wenn eine Serverversion unter 2008 erkannt wird, wird DDL für diese Typen als DATETIME ausgegeben.

Wie kann ich das beheben, so dass die Linux-Aufrufe datetime Objekte zurückgeben?

+1

Ist es wichtig, 'mssql + pyodbc' und nicht' mssql + pymssql' zu verwenden? Vielleicht ist es ein ODBC-Problem. Ich benutze normale 'datetime' Objekte, die auf demselben FreeTDS basieren. – 9000

+0

@ 9000 Ich änderte meine Verbindungszeichenfolge zu 'mssql + pymssql: // mein_benutzer: mein_passwort @ mein_server/meine_datenbank 'und ich bekomme immer noch das gleiche Ergebnis wie oben. –

+0

Läuft Ihre Linux-Box mit aktuellen Versionen von FreeTDS und SQLAlchemy? –

Antwort

1

Das Problem war, dass die Spalte tatsächlich DATETIME2 (nicht DATETIME) war und die Linux-Box FreeTDS 0.91 installiert hatte. Damit FreeTDS DATETIME2-Spalten vollständig unterstützt, müssen Sie FreeTDS 0.95 oder neuer ausführen und TDS-Protokollversion 7.3 oder 7.4 verwenden.

(Beachten Sie, dass TDS_Version "8.0" ist eigentlich nur ein Alias ​​für Version 7.1, so dass es nicht neuer als 7.3 Ref.:. here)

Natürlich Ihre andere Option aus FreeTDS_ODBC wechseln ist zum Microsoft ODBC Driver for SQL Server on Linux. In Kombination mit pyodbc ist dies eine Konfiguration, die offiziell von Microsoft unterstützt wird.

+1

Danke für den Tipp über TDS Version 8.0. Daran wäre ich eine Weile hängen geblieben. –

Verwandte Themen