MySQLdb 的 Integer 字段类型转换,long -> int

使用 MySQLdb 或 SQLAlchemy 的时候,会发现表里的 Integer 字段被默认转换为了 long 类型。这种行为其实是 DB API 做的,即都是 MySQLdb 的错(假设你在使用这个 API 的话)。这是因为 MySQL 的 unsigned int 范围已经超出了 int 的上限,强行使用可能导致溢出。

但 int 的上限在 10 万亿以上,一般用作 ID 的话,在溢出风险和便利性的权衡上其实有很大空间。因此这里给出改变 DB API 默认转换规则的方法。

MySQLdb 从数据库中读出的数据本来都是字符串类型的,对数字和其他特定类型的转换是使用了相应的函数。每种字段类型的转换函数都是可配的。

当独立使用 MySQLdb 时,可以在 connect 函数中传入一个 conv 关键字参数来指定规则:


from MySQLdb.constants import FIELD_TYPE

my_conv = { FIELD_TYPE.LONG: int }
db=_mysql.connect(conv=my_conv...)

详参: 这里

而当使用 SQLAlchemy 时候,办法是一样的。只不过因为 SQLAlchemy 已经默认有了一票转换规则,需要对参数做修改而不是完全覆盖


from MySQLdb.constants import FIELD_TYPE
from MySQLdb.converters import conversions

myconv = conversions.copy()
myconv.update({FIELD_TYPE.LONG: int})
sql_engine = create_engine(***, connect_args={‘conv‘: myconv})

其中 connect_args 里的参数会直接传递给 connect 函数。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。