使用Python操作MySQL 5.7预编译语句时遇NotImplementedError求助
解决MySQL Connector/Python 8.0.11 + Python 2.7 预编译游标 NotImplementedError 问题
我之前也碰到过一模一样的情况,这其实是因为mysql-connector-python 8.x 版本在 Python 2.7 环境下并没有完整实现服务器端预编译的核心方法,你看到的NotImplementedError就是因为cmd_stmt_prepare这个关键方法在该环境下根本没做实现导致的。
方法1:降级到兼容Python2.7的Connector版本
mysql-connector-python的5.1.x系列是完全适配Python2.7和服务器端预编译的,你可以先卸载当前版本,再安装指定稳定版本:
pip uninstall mysql-connector-python pip install mysql-connector-python==5.1.48
安装完成后,直接运行你原来的预编译游标脚本,就能正常执行查询了。
方法2:用普通游标做参数化查询(临时替代方案)
如果暂时不想降级,也可以用普通游标做参数化查询——虽然不是服务器端预编译,但同样能防止SQL注入,而且在Python2.7的8.x Connector版本里能稳定运行:
import mysql.connector connection = mysql.connector.connect(user=username, password=password, host='sql_server_host', database='dbname') print('Connected! getting cursor') cursor = connection.cursor() # 使用普通游标即可 select = "SELECT * FROM table_name WHERE column1 = %s" # 注意占位符用%s,而非? param = 'param1' print('Executing statement') cursor.execute(select, (param,)) rows = cursor.fetchall() for row in rows: value = row[0] # 注意:fetchall返回元组,需通过索引访问字段,不能用row.column1 print('value: ' + value)
小提示:普通参数化查询的占位符是
%s,和预编译游标的?语法不同,另外查询结果的行是元组类型,要通过索引获取对应字段值。
方法3:升级Python到3.x版本(长期最优解)
Python2.7已经停止官方维护多年,mysql-connector-python的8.x版本本身就是为Python3.x优化的。升级到Python3.6+后,你原来的预编译游标代码可以直接正常运行,同时还能获得更好的性能、安全性和生态支持。
内容的提问来源于stack exchange,提问作者Alex Egli
相关产品推荐
相关产品推荐

