Python执行MySQL LOAD DATA LOCAL语句时表未更新问题排查
我在MySQL客户端中可以正常执行LOAD DATA LOCAL语句将CSV数据导入表中,但用Python执行相同语句时,没有报错却没有数据填充到表中,求指点哪里出错了。
MySQL中可正常运行的语句:
LOAD DATA LOCAL INFILE '/home/user/Downloads/file.csv' INTO TABLE MyDB.MyTable FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'
我使用的Python代码:
sql_statement = """LOAD DATA LOCAL INFILE '/home/user/Downloads/file.csv' INTO TABLE MyDB.MyTable FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'""" cursor.execute(sql_statement, multi=True) connection.commit()
这种情况我之前也碰到过,主要是LOCAL参数的权限配置问题和Python连接的参数遗漏,你可以按下面的步骤逐一排查:
1. 给MySQL连接添加LOCAL_INFILE支持
绝大多数Python的MySQL驱动(比如mysql-connector-python、pymysql)默认是关闭LOCAL_INFILE功能的,必须在建立连接时显式开启:- 如果你用的是mysql-connector-python:
import mysql.connector connection = mysql.connector.connect( host='你的数据库地址', user='你的用户名', password='你的密码', database='MyDB', allow_local_infile=True # 关键配置项 ) - 如果你用的是pymysql:
import pymysql connection = pymysql.connect( host='你的数据库地址', user='你的用户名', password='你的密码', db='MyDB', local_infile=True # 关键配置项 )
- 如果你用的是mysql-connector-python:
2. 确保MySQL服务器允许LOCAL_INFILE
服务器端也需要开启这个功能,你可以:- 临时生效:在MySQL客户端执行这条SQL
SET GLOBAL local_infile = 1; - 永久生效:修改MySQL的配置文件(my.cnf或my.ini),在
[mysqld]段添加
修改后记得重启MySQL服务。[mysqld] local_infile=ON
- 临时生效:在MySQL客户端执行这条SQL
3. 移除
multi=True参数
你的cursor.execute()里用了multi=True,这个参数是用来批量执行多条SQL语句的,而你这里只有一条LOAD DATA语句,完全不需要这个参数,反而可能干扰执行逻辑。改成:cursor.execute(sql_statement) connection.commit()4. 验证文件路径和权限
确认Python运行的用户有读取/home/user/Downloads/file.csv的权限,你可以先在Python里测试读取文件:try: with open('/home/user/Downloads/file.csv', 'r') as f: print(f.readline()) except Exception as e: print(f"读取文件出错:{e}")如果这里报错,说明是文件权限或路径的问题,需要先解决这个。
按上面的步骤调整后,应该就能正常把CSV数据导入到MySQL表中了。
内容的提问来源于stack exchange,提问作者ZR_

