使用SQLite3创建带主键的表时插入数据报错,提示列数不匹配
解决SQLite插入操作的列数不匹配错误
问题重现
尝试使用Python的sqlite3库创建带主键的数据库表,执行插入时触发错误。代码如下:
import sqlite3 def connect(): conn=sqlite3.connect("books.db") cur=conn.cursor() cur.execute("CREATE TABLE IF NOT EXISTS book (id INTEGER PRIMARY KEY, title text, author text, year integer, isbn integer)") conn.commit() conn.close() def insert(title,author,year,isbn): conn=sqlite3.connect("books.db") cur=conn.cursor() cur.execute("INSERT INTO book VALUES (NULL,?,?,?,?)",(title,author,year,isbn)) conn.commit() conn.close() view() def view(): conn=sqlite3.connect('books.db') cur=conn.cursor() cur.execute("SELECT * FROM book") rows=cur.fetchall() conn.close() return rows connect() insert('anybook','anyperson',1918,6384515345) print(view())
预期输出:
[(1,'anybook','anyperson',1918,6384515345)]
实际报错:
Traceback (most recent call last): File "e:\CORSES\The Python Mega Course\000. Projects\APPs\4. BookStore\Book Store\BackEnd.py", line 28, in <module> insert('anybook','anyperson',1918,6384515345) File "e:\CORSES\The Python Mega Course\000. Projects\APPs\4. BookStore\Book Store\BackEnd.py", line 13, in insert cur.execute("INSERT INTO book VALUES (NULL,?,?,?,?)",(title,author,year,isbn)) sqlite3.OperationalError: table book has 4 columns but 5 values were supplied
错误原因
报错提示表只有4列,但插入了5个值,核心原因是:
- 你之前运行过代码,当时可能创建了不含
id列的book表(比如曾经写错了CREATE TABLE语句) - 后续代码里的
CREATE TABLE IF NOT EXISTS只会在表不存在时创建新表,不会修改已存在的表结构,导致当前表还是只有4列,和插入语句的5个值不匹配。
解决方法
方法1:删除旧数据库文件(最简单)
找到当前目录下的books.db文件并删除,重新运行代码。此时CREATE TABLE IF NOT EXISTS会创建包含id列的5列表,插入语句的5个值(NULL+4个参数)就能匹配列数,且id作为主键会自动自增(传入NULL时SQLite会自动生成递增的id值)。
方法2:修改插入语句(无需删除数据库)
如果不想删除现有数据,可以修改insert函数的SQL语句,明确指定要插入的列名,让SQLite自动处理主键id的生成:
def insert(title,author,year,isbn): conn=sqlite3.connect("books.db") cur=conn.cursor() # 明确指定列名,只插入除id外的4个字段 cur.execute("INSERT INTO book (title, author, year, isbn) VALUES (?,?,?,?)",(title,author,year,isbn)) conn.commit() conn.close() view()
这种方式下,即使表已经有id主键列,SQLite会自动为其分配自增的整数值,无需手动传入NULL。
验证
修改后重新运行代码,就能得到预期的输出:
[(1, 'anybook', 'anyperson', 1918, 6384515345)]
内容的提问来源于stack exchange,提问作者Wael El-Dikhairy
相关产品推荐
相关产品推荐

