Python执行MySQL LOAD DATA INFILE报错及代码调试求助
问题分析与解决
错误根源
你调用cursor.execute()时传参逻辑错误:该方法第一个参数是完整的SQL语句字符串,第二个参数是用于SQL参数化的占位符值(必须是list、tuple或dict类型)。但你把LOAD DATA INFILE的SQL语句拆成了两个字符串参数传入,导致第二部分SQL被当成参数处理,而它是字符串类型,不符合参数要求,所以抛出ProgrammingError。同时原代码的字符串拼接存在引号嵌套混乱的问题,也会导致SQL语句格式错误。
修复方案
将完整的SQL语句拼接成一个字符串,作为execute()的唯一参数(无需传第二个参数,这里不需要参数化)。推荐用f-string简化拼接,避免引号嵌套错误:
# 处理表名前缀,替换特殊字符 table_prefix = re.sub('[.-]', '_', i) # 拼接完整文件路径 file_path = os.path.join(path, i, file) # 构造格式正确的完整SQL语句 sql = f""" LOAD DATA INFILE '{file_path}' INTO TABLE `{table_prefix}`.posts FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES; """ # 执行SQL cursor1.execute(sql)
额外注意事项
- 权限配置:确保MySQL服务器开启了
local_infile参数,且你的数据库用户拥有FILE权限,否则LOAD DATA INFILE可能执行失败。如果是读取本地文件,可改用LOAD DATA LOCAL INFILE,同时在创建数据库连接时指定allow_local_infile=True。 - 路径转义:如果文件路径包含空格、特殊字符,要确保路径被正确包裹,示例中用单引号包裹路径可处理大部分场景。
- 注入风险:如果
i或file是外部输入内容,直接拼接SQL会存在注入风险,需手动过滤非法字符(LOAD DATA INFILE不支持参数化文件路径)。
内容的提问来源于stack exchange,提问作者Marcus Pacheco
相关产品推荐
相关产品推荐

