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

Python执行SQL INSERT插入csv数据时报OperationalError near "in"语法错误如何解决

错误原因定位
  • 核心错误是直接字符串拼接SQL语句的写法不合法:你直接把csv行内容拼到SQL里,没有对字符串类型的字段加引号、转义特殊字符,当行数据里出现in这类SQL保留关键字、单引号、空格等特殊内容时,数据库会把数据内容识别成SQL语法关键字,直接抛出语法错误,你遇到的near "in": syntax error就是这个原因导致。
  • CSV读取逻辑错误:csv.reader的delimiter参数是列分隔符,你错误设置为换行符\n,会导致读取到的每一行是整个行字符串作为唯一元素的列表,后续遍历逻辑完全不符合预期,拿到的list_是单个字符串,拼接后SQL结构完全错误。
  • 额外问题:单行提交事务,插入性能极差,不适合批量导入csv场景。
解决方法
  1. 替换字符串拼接SQL为参数化查询:所有Python数据库连接库都支持参数化查询接口,会自动处理字符串转义、引号添加、关键字识别问题,同时规避SQL注入风险。
  2. 修正CSV读取逻辑:adult.csv默认是逗号分隔的csv文件,不需要自定义delimiter,直接用csv.reader默认配置即可正确读取每一行的所有列值。
  3. 用批量插入接口替代单条插入,一次性提交事务提升导入效率。

修正后参考代码(以sqlite为例,mysql仅需替换占位符为%s)

import csv
import sqlite3

# 初始化数据库连接
conn = sqlite3.connect('your_database.db')

# 提前确认Good_Raw_Data表的字段顺序、数量和csv完全对应,建议显式指定插入字段提升稳定性:
# INSERT INTO Good_Raw_Data (col1, col2, col3, ...) VALUES (?, ?, ?, ...)
with open("adult.csv", "r", encoding="utf-8") as f:
    next(f)  # 跳过表头行
    reader = csv.reader(f)
    # 自动生成和列数匹配的参数占位符
    first_row = next(reader)
    placeholder = ','.join(['?'] * len(first_row))
    insert_sql = f'INSERT INTO Good_Raw_Data VALUES ({placeholder})'
    # 回到文件第二行(数据起始行)
    f.seek(0)
    next(f)
    # 批量插入所有数据
    conn.executemany(insert_sql, list(reader))
    conn.commit()

conn.close()

内容的提问来源于stack exchange,提问作者Suraj Goswami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:42:04