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

Python中sqlite3 cursor.execute触发OperationalError问题排查求助

问题根源与解决方案

你的错误完全来自SQL语句的语法问题,具体是这一行:

ID PRIMARY KEY (NAME,NAME)

这行写法不符合SQLite的语法规范:

  • 如果你想定义ID为主键列,需要明确指定列类型(比如INTEGER),并使用列级约束的写法:ID INTEGER PRIMARY KEY
  • 如果你想把NAME和LASTNAME设为复合主键,不需要单独的ID列,应该把主键约束放在所有列定义之后

修正方案1:使用自增ID主键

适合需要唯一ID标识每条记录的场景:

import sqlite3

def table_personal_data():  
    conn = sqlite3.connect('mailroom.db')
    cursor = conn.cursor()
    sql='''CREATE TABLE IF NOT EXISTS DONORS(
        ID INTEGER PRIMARY KEY AUTOINCREMENT,
        NAME VARCHAR(40) NOT NULL,
        LASTNAME VARCHAR(40) NOT NULL,
        EMAIL VARCHAR(50) NOT NULL,
        DRIVER_LICENSE VARCHAR(50) NOT NULL)''' 
    cursor.execute(sql)
    conn.commit()
    cursor.close()
    conn.close()

table_personal_data()

修正方案2:使用复合主键(NAME + LASTNAME)

适合用姓名组合作为唯一标识的场景:

import sqlite3

def table_personal_data():  
    conn = sqlite3.connect('mailroom.db')
    cursor = conn.cursor()
    sql='''CREATE TABLE IF NOT EXISTS DONORS(
        NAME VARCHAR(40) NOT NULL,
        LASTNAME VARCHAR(40) NOT NULL,
        EMAIL VARCHAR(50) NOT NULL,
        DRIVER_LICENSE VARCHAR(50) NOT NULL,
        PRIMARY KEY (NAME, LASTNAME))''' 
    cursor.execute(sql)
    conn.commit()
    cursor.close()
    conn.close()

table_personal_data()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:10:08