在MS SQL Server上使用sqlalchemy定义varbinary(max)列

时间:2010-06-18 08:25:56

标签: sql-server sqlalchemy

我正在使用SQLAlchemy查询SQL Server数据库,需要将列强制转换为varbinary(max)。我正在努力的是“最大”部分。我可以让演员工作适用于任何实际数字(比如varbinary(20)),但是我找不到如何让它适用于varbinary列的“max”大小。

任何指针?链接?溶液

此致 标记

3 个答案:

答案 0 :(得分:4)

我希望你们都注意到我们在自定义编译的主要文档中有这个确切的配方,没有任何monkeypatching,在这里:

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'))
)

答案 1 :(得分:2)

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')) ...

答案 2 :(得分:0)

sqlalchemy团队基于此线程(社区力量!)解决了此问题。您可以在这里Large Text/Binary Type Deprecation

找到它

要使用 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)类型,分别。自添加此标志以来,这是一种新行为。