跨数据库的SQLAlchemy应用程序的通用TEXT/CLOB数据类型

3

我正在开发一个使用MySQL作为开发环境数据库后端,使用Oracle 11g作为生产环境数据库后端的Python Web应用程序。有没有一种特定的方法可以统一SQLAlchemy文本字段,使它们在MySQL和Oracle数据库上都能正常工作?对于Oracle后端模型,我使用sqlalchemy.CLOB,对于MySQL则使用sqlalchemy.TEXT


你正在从SA模型创建数据库吗?而且是在生产环境中吗? - van
是的,数据库是从SA模型创建的。 - Jordan Jambazov
@van 我敢打赌你能回答这个问题。我是对的吧? :) - Piotr Dobrogost
@PiotrDobrogost:我有一个想法,晚些时候会尝试找时间。 - van
2个回答

5

根据@agronholm在#sqlalchemy上的说法,应该使用通用的SQLAlchemy类型Text(其中TEXT是其特殊化):

一个可变大小的字符串类型。

在SQL中,通常对应于CLOB或TEXT。还可以接受Python unicode对象并将其编码到绑定参数的数据库编码中(以及结果集的反向操作)。一般来说,TEXT对象没有长度;虽然某些数据库将在此处接受长度参数,但其他数据库将拒绝它。


1
我认为使用官方文档中的技巧应该可以解决问题: 覆盖类型编译。在这种情况下,我会保留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以避免这些和其他问题。

2
еңЁиҝҷйҮҢдҪҝз”ЁйҖҡз”Ёзҡ„SQLAlchemyзұ»еһӢTextдёҚжҳҜйҰ–йҖүи§ЈеҶіж–№жЎҲеҗ—пјҹе®ғдјҡиҮӘеҠЁиҪ¬жҚўдёәOracleзҡ„CLOBе’ҢMySQLзҡ„TEXTгҖӮ - Piotr Dobrogost
@PiotrDobrogost:你说得对,我认为它会起作用。不过,首选解决方案是使用相同的数据库引擎 :) - van
在编译其他具体类型(CLOB)的过程中,访问一个具体类型(TEXT)是否安全?任何两个具体类型都可能具有不同的语义,这会使它们不兼容。 - Piotr Dobrogost
好问题,但我认为它们是兼容的。我认为这是一个“好”的解决方案(“最好”的解决方案就是使用相同的数据库引擎),因为CLOB是生产中使用的数据类型,而另一个只用于开发/测试。再举几个例子:mssqlBIT数据类型在sqlite中没有真正的等价物。我认为根据需要进行编译是安全的。或者另一个例子是UUID(GUID)。 - van

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接