Python编写SQL Insert脚本插入订单数据时遭遇Invalid column name错误的解决方法
嘿,这个问题我太熟悉了——你遇到的是SQL字符串转义的坑,而且直接拼接SQL语句的写法本身就有大问题,咱们来一步步解决:
问题根源
你写的SQL里,第一个商品名称ADIDAS | KID'S STAN SMITH包含了单引号',直接拼进SQL后,数据库会把这个单引号当成字符串的结束标记,后面的S STAN SMITH就被误认为是列名,所以才会报Invalid column name的错误。而且这种直接拼接变量的写法还会带来SQL注入攻击的风险,绝对不能用。
正确解决方案:参数化查询
所有Python的数据库驱动(比如sqlite3、psycopg2、pyodbc等)都支持参数化查询,它会自动帮你处理字符串转义,同时彻底杜绝SQL注入。下面给你几个常用库的示例:
示例1:sqlite3(SQLite数据库)
import sqlite3 # 连接数据库 conn = sqlite3.connect("your_database.db") cursor = conn.cursor() # 准备要插入的数据,用元组列表存储 order_records = [ (7656940929251, "ADIDAS | KID'S STAN SMITH"), (242345235233, "ADIDAS | CLASSIC BACKPACK") ] # 使用?作为占位符,执行批量插入 cursor.executemany("INSERT INTO orders VALUES (?, ?)", order_records) # 提交事务并关闭连接 conn.commit() conn.close()
示例2:psycopg2(PostgreSQL数据库)
PostgreSQL的占位符用%s:
import psycopg2 # 连接数据库(替换成你的数据库信息) conn = psycopg2.connect( dbname="your_db", user="your_user", password="your_pwd", host="your_host" ) cursor = conn.cursor() order_records = [ (7656940929251, "ADIDAS | KID'S STAN SMITH"), (242345235233, "ADIDAS | CLASSIC BACKPACK") ] # 批量插入 cursor.executemany("INSERT INTO orders VALUES (%s, %s)", order_records) conn.commit() conn.close()
示例3:pyodbc(SQL Server等数据库)
大部分ODBC驱动用?作为占位符:
import pyodbc # 连接字符串(替换成你的数据库信息) conn_str = "DRIVER={SQL Server};SERVER=your_server;DATABASE=your_db;UID=your_user;PWD=your_pwd" conn = pyodbc.connect(conn_str) cursor = conn.cursor() order_records = [ (7656940929251, "ADIDAS | KID'S STAN SMITH"), (242345235233, "ADIDAS | CLASSIC BACKPACK") ] cursor.executemany("INSERT INTO orders VALUES (?, ?)", order_records) conn.commit() conn.close()
关键提醒
- 永远不要手动转义字符串(比如把
'换成''),不仅容易出错,还没法完全防范SQL注入。 - 参数化查询是Python操作数据库的标准最佳实践,不管插入、查询还是更新,都应该用这种方式。
内容的提问来源于stack exchange,提问作者SpongeSquareBobpants
相关产品推荐
相关产品推荐

