使用Python导入CSV至SQL Server时遇语法错误求助
搞定CSV导入SQL Server的语法错误问题
嘿,我看你这是在把CSV导入SQL Server时卡壳了,报错说Incorrect syntax near '/'对吧?这问题根源其实很简单——你直接把CSV里的内容拼进SQL语句里了,要是值里有单引号、斜杠这种特殊字符,肯定会把SQL的语法搞乱,而且还存在SQL注入的风险,太不安全了。
正确的姿势是用参数化查询,让pyodbc帮你自动处理这些特殊字符,既不会出错,还安全。给你改好的代码:
import pyodbc import csv print('connecting') conn = pyodbc.connect( r'DRIVER={ODBC Driver 13 for SQL Server};' r'SERVER=\.\SQLExpress;' r'DATABASE=UFOGBobservations;' r'Trusted_Connection=yes' ) print('Connected') my_cursor = conn.cursor() print('Cursor established') def insert_records(table, yourcsv, cursor, cnxn): # 把CSV数据导入目标表 with open(yourcsv, 'r', newline='', encoding='utf-8') as csvfile: csvFile = csv.reader(csvfile, delimiter=',') header = next(csvFile) # 先把表头的多余空格清掉 headers = [x.strip() for x in header] # 构建带参数占位符的SQL,pyodbc用?当占位符 placeholders = ', '.join(['?' for _ in headers]) insert_sql = f'INSERT INTO {table} ({", ".join(headers)}) VALUES ({placeholders})' # 遍历每一行数据 for row in csvFile: # 清理每行字段的前后空格 cleaned_row = [x.strip() for x in row] # 用参数化方式执行,把值单独传进去,不用拼字符串 cursor.execute(insert_sql, cleaned_row) conn.commit() # 一定要提交,除非你数据库开了自动提交 cursor.close() conn.close() table = 'table_1' mycsv = r'C:\DataAnalystData\UFOGB_Observations.csv' # 换成你的文件路径 insert_records(table, mycsv, my_cursor, conn)
给你说说改了啥:
- 参数化查询:用
?代替直接拼值,pyodbc会自动处理特殊字符的转义,这就解决了你碰到的斜杠语法错误 - 更直观的字段清理:用列表推导式代替
map,看起来更清楚,也方便调试 - 优化文件读取:加了
newline=''和指定编码,避免读取CSV时出现换行符乱码的问题 - 资源收尾:函数最后把游标和连接都关了,避免占着数据库资源
额外提个小建议:
要是你的CSV文件特别大,用循环一条一条插太慢,换成executemany批量插会快很多,把循环那部分改成这样就行:
# 先把所有行存起来 rows = [] for row in csvFile: cleaned_row = [x.strip() for x in row] rows.append(cleaned_row) # 一次性批量插入 cursor.executemany(insert_sql, rows)
这样改完,你那语法错误肯定能解决,代码也更靠谱啦!
内容的提问来源于stack exchange,提问作者B McG
相关产品推荐
相关产品推荐

