You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何映射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

火山引擎 最新活动