Python执行MySQL8.0 SQL脚本未生效 无法成功创建数据表
问题根因与修复方案
故障背景
- 运行环境:MySQL 8.0服务端,已提前手动创建名为
tentativo的业务库,建表脚本database.sql包含users、channels、messages三张表的定义,Python执行脚本与SQL文件放在同一目录 - 已安装依赖:
mysql 0.0.3、mysql-connector 2.2.9、mysql-connector-python 8.0.29、mysqlclient 2.1.0 - 初始实现逻辑:通过
connection.MySQLConnection配置root账号、本地存储的密码、127.0.0.1地址、默认连接库为tentativo建立连接,创建MySQLCursor游标,读取SQL文件内容后调用cursor.execute(file.read(), multi=True)执行语句 - 故障表现:脚本运行无报错,但进入MySQL CLI执行
show tables返回空集,三张表始终未创建;后续补充commit()、close()连接逻辑,改用connect()方法初始化连接后问题仍存在,SQL执行无实际持久化效果
核心原因
mysql-connector-python驱动中,调用execute()传入multi=True参数时,方法会返回一个语句执行结果的迭代器,必须手动迭代遍历这个迭代器,所有SQL语句才会被实际发送到MySQL服务端执行。直接调用方法不消费返回值的情况下,所有SQL只会停留在客户端缓存,根本不会提交到服务端解析执行,自然不会产生建表效果,后续调用commit()也只是提交了一个空事务,没有任何实际变更。
同时存在以下高风险问题:
- 同时安装4个不同来源的MySQL Python驱动,存在极高的包导入冲突概率,极易出现实际调用的连接、执行方法不属于预期驱动的情况
- 未添加异常捕获逻辑,即使SQL脚本存在语法错误、账号权限不足等问题,脚本也会静默失败无任何报错提示
- 未主动校验连接的默认库,存在连接意外切换到其他无权限库、建表操作被静默丢弃的可能
修复步骤
- 清理冗余冲突依赖,仅保留官方维护的驱动即可,执行如下命令卸载无关包:
pip uninstall -y mysql mysql-connector mysqlclient pip install --force-reinstall mysql-connector-python==8.0.29
- 修正Python执行逻辑,必须消费
multi=True返回的迭代器,参考可直接运行的代码:
import mysql.connector from mysql.connector import Error def init_database(): conn = None cursor = None try: # 初始化数据库连接 conn = mysql.connector.connect( host="127.0.0.1", user="root", password="替换为你的本地root账号密码", database="tentativo", charset="utf8mb4" ) cursor = conn.cursor() # 读取建表脚本 with open("database.sql", "r", encoding="utf-8") as sql_file: sql_script = sql_file.read() # 执行多语句,遍历迭代器触发实际执行 for exec_result in cursor.execute(sql_script, multi=True): if exec_result.with_rows: exec_result.fetchall() # 所有语句执行完成后统一提交事务 conn.commit() print("建表脚本执行完成") except Error as e: print(f"执行出错: {str(e)}") if conn: conn.rollback() finally: # 释放资源 if cursor: cursor.close() if conn and conn.is_connected(): conn.close() if __name__ == "__main__": init_database()
前置校验SQL脚本:打开
database.sql确认每条建表语句末尾以分号结尾,无语法错误,脚本中不存在USE 其他库名的语句切换操作库。运行修复后的脚本,进入MySQL CLI执行如下命令校验结果:
USE tentativo; SHOW TABLES;
正常返回结果中会包含users、channels、messages三张表。
内容的提问来源于stack exchange,提问作者FLAK-ZOSO
相关产品推荐
相关产品推荐

