使用 MySQLdb 或 SQLAlchemy 的時候,會發現表裡的 Integer 字段被預設轉換為了 long 類型。這種行為其實是 DB API 做的,即都是 MySQLdb 的錯(假設你在使用這個 API 的話)。這是因為 MySQL 的 unsigned int 範圍已經超出了 int 的上限,強行使用可能導緻溢出。
但 int 的上限在 10 萬億以上,一般用作 ID 的話,在溢出風險和便利性的權衡上其實有很大空間。是以這裡給出改變 DB API 預設轉換規則的方法。
MySQLdb 從資料庫中讀出的資料本來都是字元串類型的,對數字和其他特定類型的轉換是使用了相應的函數。每種字段類型的轉換函數都是可配的。
當獨立使用 MySQLdb 時,可以在 connect 函數中傳入一個 conv 關鍵字參數來指定規則:
lang:python
from MySQLdb.constants import FIELD_TYPE
my_conv = { FIELD_TYPE.LONG: int }
db=_mysql.connect(conv=my_conv...)
詳參: 這裡
而當使用 SQLAlchemy 時候,辦法是一樣的。隻不過因為 SQLAlchemy 已經預設有了一票轉換規則,需要對參數做修改而不是完全覆寫
lang:python
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 函數。