天天看點

long integer python_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 關鍵字參數來指定規則:

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 函數。