Определите столбец varbinary (max) с помощью sqlalchemy на MS SQL Server - PullRequest
2 голосов
/ 18 июня 2010

Я запрашиваю базу данных SQL Server, используя SQLAlchemy, и мне нужно преобразовать столбец в varbinary (max). То, с чем я борюсь, это «макс». Я могу заставить приведение работать для любого действительного числа (скажем, varbinary (20)), но я не могу найти способ заставить его работать для размера "max" столбца varbinary.

Есть указатели? Ссылки? Решения?

С уважением, Mark

Ответы [ 3 ]

4 голосов
/ 21 июня 2010

Надеюсь, вы все заметили, что у нас есть практически этот точный рецепт в основной документации для пользовательской компиляции, без каких-либо манипуляций, здесь:

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'))
)
2 голосов
/ 18 июня 2010

SQLAlchemy не поддерживает это "из коробки" (создайте запрос функции на sqlalchemy trac ).

Чтобы заставить его работать на вас, взломайте его: добавьте следующий метод к классу MSTypeCompiler в sqlalchemy\dialects\mssql\base.py:

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

, а затем используйте запрос с типом MSVarBinary:

from sqlalchemy.dialects.mssql.base import MSVarBinary
...
q = ... cast(mytable.c.mycolumn, MSVarBinary('MAX')) ...
0 голосов
/ 25 октября 2018

Команда sqlalchemy решила эту проблему, основываясь на этой теме (Сила сообщества!). Вы можете найти его здесь Большой текст / Устаревание двоичного типа

Чтобы использовать VARBINARY (max) , используйте LargetBinary в качестве типа данных и установите флаг deprecate_large_types = True

с сайта; создать движок с флагом deprecate_large_types = True :

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

Когда этот флаг равен True , типы данных UnicodeText, Text и LargeBinary, используемые для визуализации DDL, будут отображать типы NVARCHAR (max), VARCHAR (max) и VARBINARY (max) соответственно , Это новое поведение с добавлением этого флага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...