点击添加商品页保存按钮报错:SQLite表items无IsSold列
解决SQLite表缺失IsSold列导致的OperationalError错误
问题根源
你的Unisell系统中,items表仅在首次运行时创建,后续新增的IsSold字段不会自动同步到已存在的旧表中,导致插入数据时因字段不匹配触发sqlite3.OperationalError。
解决方案
方案1:给现有表添加缺失列(保留数据)
在Database类中新增数据库升级方法,启动时自动检查并添加IsSold列:
def upgrade_database(self): try: # 给items表添加IsSold列,默认值设为0(代表未售出) self.conn.execute("ALTER TABLE items ADD COLUMN IsSold INTEGER DEFAULT 0") self.conn.commit() except sqlite3.OperationalError: # 若列已存在,直接忽略错误 pass
在Database类的初始化方法中调用upgrade_database(),确保每次启动程序都会执行字段检查。
方案2:重建表(清空现有数据,适合测试环境)
- 直接删除本地SQLite数据库文件(通常为
.db或.sqlite后缀),重启程序后代码会自动创建包含IsSold列的新表。 - 或者临时在代码中添加删表逻辑(执行一次后移除):
# 仅执行一次,完成后删除该行代码 self.conn.execute("DROP TABLE IF EXISTS items")
重新运行程序,让原有的表创建逻辑生成新表。
方案3:优化表创建逻辑(避免后续同类问题)
修改原有的表创建代码,先尝试添加字段再创建表,确保字段始终存在:
def create_table(self): # 先检查并添加IsSold列 try: self.conn.execute("ALTER TABLE items ADD COLUMN IsSold INTEGER DEFAULT 0") except sqlite3.OperationalError: pass # 创建表(若不存在) self.conn.execute('''CREATE TABLE IF NOT EXISTS items (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, price REAL NOT NULL, description TEXT, IsSold INTEGER DEFAULT 0)''') self.conn.commit()
内容的提问来源于stack exchange,提问作者Mawahib Ali
相关产品推荐
相关产品推荐

