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
相关产品推荐
相关产品推荐

