SQLite3报no such column错误:表和字段正确为何仍触发OperationalError
报错根因
你代码中add_task方法的SQL插入语句写法存在两处核心错误:
- 你在
VALUES子句后多写了一个逗号,SQLite会认为你要同时插入两组数据,第二组括号内的内容会被识别为字段名而非Python变量 - 你将Python侧的参数直接写在了SQL语句的引号内部,SQL执行时会把
title、notes等内容当成要查询的字段名,而非要插入的参数值,因此抛出「找不到title字段」的错误。sqlite3的cursor.execute方法要求SQL语句和参数分离开传递,不能直接把参数拼接在SQL字符串中。
修正后的代码
import sqlite3 # 原代码漏了导入sqlite3,此处补充 class Db: # 连接和游标改为实例属性,避免类属性多实例复用导致的操作异常 def __init__(self): self.conn = sqlite3.connect('database.db') self.cursor = self.conn.cursor() def create_table(self): # 新增IF NOT EXISTS判断,避免重复运行时报表已存在错误 create_Tasks_table = '''CREATE TABLE IF NOT EXISTS Tasks ( id INTEGER PRIMARY KEY, title TEXT NOT NULL, notes TEXT, deadline TEXT, state INTEGER);''' self.cursor.execute(create_Tasks_table) self.conn.commit() def add_task(self, title, notes, deadline): state = 0 # SQL仅保留占位符,参数通过execute的第二个参数以元组形式传入 add_to_Tasks_table = """INSERT INTO Tasks (title, notes, deadline, state) VALUES (?, ?, ?, ?)""" self.cursor.execute(add_to_Tasks_table, (title, notes, deadline, state)) self.conn.commit() # 补充连接关闭方法,避免资源泄露 def close_conn(self): self.conn.close() if __name__ == "__main__": db = Db() db.create_table() db.add_task("title1", "Note1", "2021-10-30 18:00:00") db.close_conn()
内容的提问来源于stack exchange,提问作者Heikki
相关产品推荐
相关产品推荐

