如何让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
相关产品推荐
相关产品推荐

