Python使用mysql.connector加载SQL文件报1064错误如何正确导入数据
mysql.connector导入SQL文件报1064语法错误解决方案
错误根因
当前逐行读取执行的逻辑完全不符合SQL执行规则:
- SQL以分号
;作为单条语句的结束标记,而非换行符 - 示例中的
CREATE TABLE语句跨越多行,逐行读取拿到的都是不完整的SQL片段,直接执行必然触发语法错误 - 逐行读取会把语句末尾的分号和语句主体拆分,执行的内容不符合MySQL语法规范
正确实现代码
核心逻辑是读取全量SQL文件内容,按分号拆分出完整的单条语句,过滤空内容后逐个执行:
import mysql.connector # 建立数据库连接,开启自动提交适配DDL语句执行 db = mysql.connector.connect( host="localhost", user="XXXX", passwd='XXXX', autocommit=True ) mycursor = db.cursor() # 一次性读取整个SQL文件内容,指定匹配的文件编码避免乱码 with open('Structure.sql', 'r', encoding='utf-8') as sql_file: full_sql = sql_file.read() # 按分号拆分单条语句,过滤空内容、多余空白字符 sql_list = [statement.strip() for statement in full_sql.split(';') if statement.strip()] # 遍历执行所有合法SQL语句 for single_sql in sql_list: mycursor.execute(single_sql) # 释放资源 mycursor.close() db.close()
适配复杂场景的补充说明
- 如果SQL文件包含
--单行注释、/* */块注释,需要在拆分语句前通过正则把注释内容替换为空,避免注释内容干扰SQL执行 - 如果要导入的SQL包含存储过程、自定义函数这类内部自带分号的逻辑,可在调用
execute()时传入multi=True参数直接执行全量SQL内容,不需要手动拆分 - 读取SQL文件时必须指定和文件存储一致的编码格式,避免特殊字符、中文乱码触发语法错误
- 执行完结构导入后如果需要批量导入数据,建议拼接批量INSERT语句执行,提升导入效率
内容的提问来源于stack exchange,提问作者Kacper Łęczyński
相关产品推荐
相关产品推荐

