我正在开发一个使用MySQL作为开发环境数据库后端,使用Oracle 11g作为生产环境数据库后端的Python Web应用程序。有没有一种特定的方法可以统一SQLAlchemy文本字段,使它们在MySQL和Oracle数据库上都能正常工作?对于Oracle后端模型,我使用sqlalchemy.CLOB
,对于MySQL则使用sqlalchemy.TEXT
。
我正在开发一个使用MySQL作为开发环境数据库后端,使用Oracle 11g作为生产环境数据库后端的Python Web应用程序。有没有一种特定的方法可以统一SQLAlchemy文本字段,使它们在MySQL和Oracle数据库上都能正常工作?对于Oracle后端模型,我使用sqlalchemy.CLOB
,对于MySQL则使用sqlalchemy.TEXT
。
根据@agronholm在#sqlalchemy上的说法,应该使用通用的SQLAlchemy类型Text
(其中TEXT
是其特殊化):
一个可变大小的字符串类型。
在SQL中,通常对应于CLOB或TEXT。还可以接受Python unicode对象并将其编码到绑定参数的数据库编码中(以及结果集的反向操作)。一般来说,TEXT对象没有长度;虽然某些数据库将在此处接受长度参数,但其他数据库将拒绝它。
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)
Text
дёҚжҳҜйҰ–йҖүи§ЈеҶіж–№жЎҲеҗ—пјҹе®ғдјҡиҮӘеҠЁиҪ¬жҚўдёәOracleзҡ„CLOB
е’ҢMySQLзҡ„TEXT
гҖӮ - Piotr DobrogostCLOB
)的过程中,访问一个具体类型(TEXT
)是否安全?任何两个具体类型都可能具有不同的语义,这会使它们不兼容。 - Piotr DobrogostCLOB
是生产中使用的数据类型,而另一个只用于开发/测试。再举几个例子:mssql
的BIT
数据类型在sqlite
中没有真正的等价物。我认为根据需要进行编译是安全的。或者另一个例子是UUID(GUID)。 - van