2 Stimmen

Definieren einer varbinary(max)-Spalte mit sqlalchemy auf MS SQL Server

Ich frage eine SQL Server-Datenbank mit SQLAlchemy ab und muss eine Spalte in varbinary(max) umwandeln. Die Sache, mit der ich zu kämpfen habe, ist der "max"-Teil. Ich kann den Cast für jede tatsächliche Zahl (z. B. varbinary(20)) durchführen, aber ich kann nicht herausfinden, wie ich ihn für die "maximale" Größe der varbinary-Spalte durchführen kann.

Haben Sie einen Tipp? Links? Lösungen?

Grußworte, Mark

5voto

zzzeek Punkte 66340

Ich hoffe, Sie haben alle bemerkt, dass wir praktisch genau dieses Rezept in der Hauptdokumentation für die benutzerdefinierte Kompilierung, ohne Monkeypatching, hier haben:

http://www.sqlalchemy.org/docs/reference/ext/compiler.html?highlight=compiler#changing-compilation-of-types

@compiles(String, 'mssql')
@compiles(VARCHAR, 'mssql')
def compile_varchar(element, compiler, **kw):
    if element.length == 'max':
        return "VARCHAR('max')"
    else:
        return compiler.visit_VARCHAR(element, **kw)

foo = Table('foo', metadata,
    Column('data', VARCHAR('max'))
)

2voto

van Punkte 66788

SQLAlchemy unterstützt dies nicht von Haus aus (erstellen Sie eine Funktionsanfrage auf sqlalchemy trac ).

Damit es für Sie funktioniert, fügen Sie die folgende Methode in die MSTypeCompiler Klasse in sqlalchemy\dialects\mssql\base.py :

def visit_VARBINARY(self, type_):
    if type_.length == 'MAX':
        return "VARBINARY(MAX)"
    else:
        return "VARBINARY(%d)" % type_.length

und verwenden Sie dann die Abfrage mit der Option MSVarBinary Typ:

from sqlalchemy.dialects.mssql.base import MSVarBinary
...
q = ... cast(mytable.c.mycolumn, MSVarBinary('MAX')) ...

0voto

Philip Punkte 904

Das Sqlalchemy-Team hat dieses Problem auf der Grundlage dieses Threads (Power of Community!) gelöst. Sie können ihn hier finden Großer Text/Binärschrift Verwerfung

Zur Verwendung VARBINARY(max) verwenden. LargetBinary als Datentyp, und setzen Sie das Flag deprecate_large_types=True

Von der Website; erstellen Sie einen Motor mit der Flagge deprecate_large_types=True :

eng = create_engine("mssql+pymssql://user:pass@host/db",deprecate_large_types=True)

Wenn dieses Flag gesetzt ist Wahr werden die Datentypen UnicodeText, Text und LargeBinary, wenn sie zur Darstellung von DDL verwendet werden, die Typen NVARCHAR(max), VARCHAR(max) bzw. VARBINARY(max) darstellen. Dies ist ein neues Verhalten, das mit dem Hinzufügen dieses Flags eingeführt wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X