使用SQLite插入数据遇sqlite3.OperationalError:1 values for 3 columns错误求助
修复SQLite插入数据的报错问题
我来帮你把这些问题一个个理清楚,快速解决这个报错:
核心错误点拆解
错误嵌套
execute调用
你在cur.execute里又嵌套了一层cur.execute,这是完全多余的,直接调用一次cur.execute就够了。占位符被错误包裹单引号
SQLite的参数化查询中,?是占位符,不需要用单引号括起来。你写成VALUES ('?,?,?')时,数据库会把整个'?,?,?'当作一个字符串值,自然会报“1个值对应3列”的错误。参数传递错用了字符串字面量
你传入的是('item','quantity','price')这三个固定字符串,而不是函数参数里的item, quantity, price变量,等于你根本没用到调用函数时传入的"Cup",4,5。代码笔误
最后调用插入函数时写了impo insert("Cup", 4, 5),这里的impo是多余的,直接调用函数即可。
修正后的完整代码
import sqlite3 conn = sqlite3.connect('lite.db') cur = conn.cursor() cur.execute('CREATE TABLE IF NOT EXISTS store(item TEXT, quantity INTEGER, price REAL)') conn.commit() def insert(item, quantity, price): conn = sqlite3.connect('lite.db') cur = conn.cursor() # 修正:移除嵌套的execute,去掉占位符的单引号,使用函数参数 cur.execute("INSERT INTO store(item, quantity, price) VALUES (?,?,?)", (item, quantity, price)) conn.commit() conn.close() # 修正:去掉错误的impo前缀,直接调用函数 insert("Cup", 4, 5) def view(): conn = sqlite3.connect('lite.db') cur = conn.cursor() cur.execute("SELECT * FROM store") rows = cur.fetchall() conn.close() return rows print(view())
额外优化建议
- 可以考虑把数据库连接的逻辑封装一下,避免重复写
connect和close,比如用上下文管理器with来自动管理连接,这样更简洁也不容易忘记关闭连接:
def insert(item, quantity, price): with sqlite3.connect('lite.db') as conn: cur = conn.cursor() cur.execute("INSERT INTO store(item, quantity, price) VALUES (?,?,?)", (item, quantity, price)) # 使用with的话,不需要手动commit和close,会自动处理
内容的提问来源于stack exchange,提问作者Aryan Basle
相关产品推荐
相关产品推荐

