如何映射pymysql.cursor.description返回的数据类型代码与实际类型?
解决pymysql cursor.description类型代码与实际数据类型的映射问题
嘿,我之前也碰到过这个头疼的问题!你提到的那些数字类型代码(比如1对应nvchar、3对应int)其实是MySQL底层协议定义的字段类型编码,pymysql已经把这些编码封装成了现成的常量,不用你自己手动查文档凑对应关系~
具体实现方法
1. 导入pymysql的类型常量模块
首先在代码里导入FIELD_TYPE模块,这里面存着所有MySQL类型对应的编码:
from pymysql.constants import FIELD_TYPE
2. 构建编码到类型名称的映射字典
FIELD_TYPE里的常量是“类型名称: 编码”的形式(比如FIELD_TYPE.INT = 3),我们可以反向生成一个方便查询的字典:
# 过滤掉模块内部的私有属性,只保留类型常量 type_code_to_name = {v: k for k, v in FIELD_TYPE.__dict__.items() if not k.startswith('_')}
3. 修改原代码完成映射
注意一定要先执行SQL查询,不然cursor.description会是None!修改后的完整代码如下:
import pymysql from pymysql.constants import FIELD_TYPE def conn(): # 注意参数名规范,原代码的server应该是host myDb = pymysql.connect(host=server, user=user, password=password, database=database) return myDb sql_select_query = 'select * from table' dbc = conn() dbCursor = dbc.cursor() # 必须先执行查询,才能获取cursor.description dbCursor.execute(sql_select_query) # 替换类型代码为实际类型名称 field_names_and_type = [ (desc[0], type_code_to_name.get(desc[1], 'UNKNOWN_TYPE')) for desc in dbCursor.description ]
示例输出
原来的输出[('ItemId', 1), ('ItemName', 3)]会变成:
[('ItemId', 'CHAR'), ('ItemName', 'INT')]
注:你说的nvchar在MySQL协议里和CHAR、VARCHAR共用编码1,对应pymysql里的FIELD_TYPE.CHAR,如果需要更细分的话,可以结合cursor.description里的其他属性(比如字符集)来判断,但大部分场景下用FIELD_TYPE的常量就足够了。
额外小提示
如果遇到不常见的类型代码,type_code_to_name.get()会返回'UNKNOWN_TYPE',你可以直接打印FIELD_TYPE.__dict__查看所有支持的类型和对应的编码,比如:
print({k: v for k, v in FIELD_TYPE.__dict__.items() if not k.startswith('_')})
这样就能看到所有pymysql支持的类型编码对应关系啦~
内容的提问来源于stack exchange,提问作者Bogdan Tudorache




