【问题标题】:Define a varbinary(max) column using sqlalchemy on MS SQL Server在 MS SQL Server 上使用 sqlalchemy 定义 varbinary(max) 列
【发布时间】:2010-06-18 08:25:55
【问题描述】:

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

有什么建议吗?链接?解决方案?

问候, 标记

【问题讨论】:

  • 我没有任何使用 SQLAlchemy 的经​​验,但according to this page length 参数是可选的,默认为 None。难道None代表的是“MAX”?
  • 很遗憾没有。这只会产生一个 CAST(x as VARBINARY),然后导致“列将被截断”错误。

标签: sql-server sqlalchemy


【解决方案1】:

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

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

【讨论】:

  • @Mike:奇怪,但以前没见过这个。这是否是处理目标数据库中缺少类型的数据库迁移的最佳方法:例如,将BITmssql 迁移到sqlite
  • 一个非常好的解决方案。我将不得不进一步研究编译器扩展。
  • 我认为我们没有 BIT 作为基本类型,将 UserDefinedType 子类化是最简单的:sqlalchemy.org/docs/reference/sqlalchemy/…
【解决方案2】:

SQLAlchemy 不支持此功能(在 sqlalchemy trac 上创建功能请求)。

为了让它为你工作,破解它:将以下方法添加到sqlalchemy\dialects\mssql\base.py 中的MSTypeCompiler 类:

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

【讨论】:

    【解决方案3】:

    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) 类型,分别。这是添加此标志后的新行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-23
      • 2019-04-30
      • 2020-05-04
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2018-11-13
      • 2014-07-29
      相关资源
      最近更新 更多