You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Python MySQL Connector游标同时支持预处理语句与字典格式?

解决mysql.connector游标同时支持预处理语句和字典格式的问题

我完全懂你的需求——既要用预处理语句来避免SQL注入、提升查询性能,又希望查询结果能以字典格式返回(不用再记元组的索引,直接按字段名取值)。确实mysql.connector默认的游标设置没法直接同时满足这两个要求,不过咱们可以通过自定义游标类来轻松解决这个问题。

核心思路

mysql.connector里的MySQLCursorPrepared负责提供预处理语句功能,MySQLCursorDict负责把查询结果转换成字典格式。我们只需要创建一个同时继承这两个类的自定义游标,就能让游标同时拥有这两个特性。

完整代码示例

import mysql.connector
from mysql.connector.cursor import MySQLCursorPrepared, MySQLCursorDict

# 自定义游标类:同时继承预处理游标和字典游标
class PreparedDictCursor(MySQLCursorPrepared, MySQLCursorDict):
    pass

# 建立数据库连接时指定自定义游标类
db_conn = mysql.connector.connect(
    host="你的数据库地址",
    user="用户名",
    password="密码",
    database="目标数据库",
    cursor_class=PreparedDictCursor
)

# 使用游标执行预处理查询
with db_conn.cursor() as cursor:
    # 预处理语句(用%s作为占位符)
    query = "SELECT id, username, email FROM users WHERE id = %s"
    cursor.execute(query, (123,))
    
    # 获取字典格式的结果
    user = cursor.fetchone()
    print(user)  # 输出示例: {'id': 123, 'username': 'johndoe', 'email': 'john@example.com'}

# 关闭连接
db_conn.close()

替代方案(无需自定义类)

如果你不想自定义类,也可以在使用预处理游标时,手动把查询结果转换成字典:

import mysql.connector

db_conn = mysql.connector.connect(
    host="你的数据库地址",
    user="用户名",
    password="密码",
    database="目标数据库"
)

with db_conn.cursor(prepared=True) as cursor:
    query = "SELECT id, username, email FROM users WHERE id = %s"
    cursor.execute(query, (123,))
    
    # 获取字段名列表
    column_names = [col[0] for col in cursor.description]
    # 把结果元组和字段名配对成字典
    user = dict(zip(column_names, cursor.fetchone()))
    print(user)

db_conn.close()

不过这种方式每次查询都要手动处理结果,不如自定义游标类来得方便和优雅。

内容的提问来源于stack exchange,提问作者user3525290

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:22:58