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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:54:01