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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:57:43