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场景。
解决方法
- 替换字符串拼接SQL为参数化查询:所有Python数据库连接库都支持参数化查询接口,会自动处理字符串转义、引号添加、关键字识别问题,同时规避SQL注入风险。
- 修正CSV读取逻辑:adult.csv默认是逗号分隔的csv文件,不需要自定义
delimiter,直接用csv.reader默认配置即可正确读取每一行的所有列值。 - 用批量插入接口替代单条插入,一次性提交事务提升导入效率。
修正后参考代码(以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
相关产品推荐
相关产品推荐

