You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SQLAlchemy和Python循环插入MySQL数据时的语法错误问题

问题解决方法

核心语法错误修复

你的INSERT语句存在两个致命语法问题:

  1. VALUES子句的每组值必须用括号包裹
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:01:23