使用SQLAlchemy和Python循环插入MySQL数据时的语法错误问题
问题解决方法
核心语法错误修复
你的INSERT语句存在两个致命语法问题:
- VALUES子句的每组值必须用括号包裹
- VALUES中不需要给字段加
as directoryname,这属于多余的无效语法
错误SQL示例:
insert into LISTING_AUDIT_CHECK (jobname,directoryname) values 'Activity A','A_2022' as directoryname;
修正后的基础SQL格式:
insert into LISTING_AUDIT_CHECK (jobname, directoryname) values ('Activity A', 'A_2022');
代码整体优化(解决所有潜在问题)
1. 移除循环内的冗余函数定义
把convertTuple移到循环外部,避免每次循环重复定义函数,浪费资源。
2. 简化dirname获取逻辑
原代码中dirname_tup后面多了个逗号,导致生成不必要的元组,直接处理字符串即可。
3. 修正变量大小写不一致问题
代码中定义的是jobname,但SQL模板里误用了jobName,统一变量名大小写。
4. 用参数化查询替代字符串拼接
彻底避免SQL注入风险,同时规避字符串转义导致的语法错误。
5. 使用正确的执行方法
pd.read_sql仅用于查询数据,插入操作需用SQLAlchemy的execute方法。
修正后的完整代码:
# 把函数移到循环外部,避免重复定义 def convertTuple(tup): return ''.join(tup) # 循环处理目标文件 for filenames in [file for file in inbound_files if file.endswith('.json')]: jobname = "Activity A" # 简化dirname获取逻辑,无需生成元组 dirname = [x for x in source_folder.split("/") if x != ''][-1].upper() # 如果确实需要处理元组,再调用convertTuple,当前场景无需此步骤 # dirname = convertTuple(dirname_tup) # 使用参数化SQL,避免注入和语法错误 sql = ''' INSERT INTO LISTING_AUDIT_CHECK (jobname, directoryname) VALUES (:jobname, :dirname); ''' # 执行插入操作 my_conn.execute(sql, {"jobname": jobname, "dirname": dirname}) # 若连接未开启自动提交,必须手动提交 my_conn.commit()
额外说明
- 若你的数据库连接开启了自动提交模式,可省略
my_conn.commit();否则必须调用该方法才能将插入操作持久化到数据库。 - MySQL也支持用
%s作为参数占位符,写法如下:sql = ''' INSERT INTO LISTING_AUDIT_CHECK (jobname, directoryname) VALUES (%s, %s); ''' my_conn.execute(sql, (jobname, dirname))
内容的提问来源于stack exchange,提问作者ross k
相关产品推荐
相关产品推荐

