【问题标题】:Generic TEXT/CLOB data type for cross-database SQLAlchemy application跨数据库 SQLAlchemy 应用程序的通用 TEXT/CLOB 数据类型
【发布时间】:2016-04-09 02:21:54
【问题描述】:

我正在开发 Python Web 应用程序,该应用程序在开发环境中使用 MySQL 作为数据库后端,在生产环境中使用 Oracle 11g。是否有统一 SQLAlchemy 文本字段的特定方法,以便它们同时适用于 MySQL 和 Oracle 数据库?对于模型中的 Oracle 后端,我使用 sqlalchemy.CLOB 和 MySQL sqlalchemy.TEXT

【问题讨论】:

  • 您是从 SA 模型创建数据库吗?也在制作中?
  • 是的,数据库是从 SA 模型创建的。
  • @van 我敢打赌你能回答这个问题。我对吗? :)
  • @PiotrDobrogost:我有个主意,今晚晚些时候会找时间。

标签: python database sqlalchemy


【解决方案1】:

根据#sqlalchemy 上的@agronholm,应该使用通用SQLAlchemy 类型TextTEXT 是其特化):

可变大小的字符串类型。

在SQL中,通常对应CLOB或TEXT。也可以带Python unicode 对象并在绑定参数中编码为数据库的编码 (结果集则相反。)通常,TEXT 对象不会 有长度;而一些数据库将接受长度参数 在这里,它会被其他人拒绝。

【讨论】:

    【解决方案2】:

    我认为使用这个官方文档技巧应该可以解决问题:Overiding Type Compilation。在这种情况下,我会将CLOB 保留为原始版本,因为它用于生产,并且会为mysql 应用编译:

    from sqlalchemy.ext.compiler import compiles
    from sqlalchemy.types import CLOB
    
    @compiles(CLOB, "mysql")
    def compile_binary_mysql(type_, compiler, **kw):
        return "TEXT"
        # @note: this will handle other parameter such as `length`
        # return compiler.visit_TEXT(type_, **kw)
    

    请注意,强烈建议在生产/测试/开发中使用相同的 RDBMS,以避免这些问题和其他问题。

    【讨论】:

    • 这里使用泛型 SQLAlchemy 类型 Text 不是首选解决方案吗?它会自动转换为 Oracle 的 CLOB 和 MySQL 的 TEXT
    • @PiotrDobrogost:你是​​对的,我认为它会起作用。首选的解决方案是使用相同的数据库引擎:)
    • 在编译其他具体类型 (CLOB) 时访问一种具体类型 (TEXT) 是否安全?任何两种具体类型都可以有不同的语义,这会使它们不兼容。
    • 好问题,但我认为它们是兼容的。为什么我还认为这是一个“好”的解决方案(“最好的”只是使用相同的数据库引擎)是 CLOB 是生产中使用的数据类型,而另一个仅用于开发/测试。给你其他例子:mssqlBIT 数据类型在sqlite 中并没有真正的等价物。我认为按照自己认为合适的方式编译它是安全的。或者另一个例子是 UUID (GUID)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2011-03-03
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多