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

Python操作SQLite3插入行报错:sqlite3.OperationalError: no such column: asd

解决sqlite3.OperationalError: no such column: asd的问题

嘿,这个坑我之前也踩过!你遇到的错误完全是因为直接把字符串值拼进SQL语句里,导致SQLite把你的字段值当成列名解析了。

问题根源

看你的代码片段,你用%格式化把request.form['scholarship_name']的值直接插入SQL语句,比如当这个值是asd时,生成的SQL会变成这样:

INSERT INTO your_table VALUES (asd, 3.5, 1000, Male, ...)

注意这里的asd没有加引号,SQLite会默认把它当成一个列名来查找,而你的表根本没有叫asd的列,自然就报错了。

正确的做法:用参数化查询

sqlite3模块官方推荐用参数化查询来处理动态值,它会自动帮你处理字符串的引号问题,还能防止SQL注入。代码改成这样:

conn = sqlite3.connect('pathfinder.db')
c = conn.cursor()

# 用问号作为值的占位符,参数放在execute的第二个元组参数里
c.execute(
    "INSERT INTO {} VALUES (?, ?, ?, ?, ?, ?, ?)".format(table),
    (
        request.form['scholarship_name'],
        request.form['scholarship_gpa'],
        request.form['scholarship_amount'],
        "Male",
        # 补全你剩下的字段值
    )
)

conn.commit()  # 一定要提交事务,不然数据不会写入数据库!

额外提醒

  • 如果你的table变量也是动态生成的(比如来自用户输入),那用format的时候要格外小心,确保表名是安全可信的——因为参数化查询不支持表名的占位,只能手动格式化,但绝对不能让用户随便输入表名,否则会有安全风险。
  • 永远不要直接把用户输入的值拼进SQL语句里,除了语法问题,还会导致严重的SQL注入漏洞。

内容的提问来源于stack exchange,提问作者Matthew Decarlo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:02:56