Python操作SQLite3建表成功后插入报no such table错误如何解决
错误原因
- 建表SQL缺少
IF NOT EXISTS判断,重复执行建表操作会直接抛出「表已存在」的异常,你的代码仅对异常做了打印处理,没有额外的失败提示,很容易误以为建表执行成功,实际表根本没有创建。此外你建表成功后的打印内容为This table "Person" is already created!,和实际创建的employee表名完全不符,也说明建表逻辑的校验逻辑本身存在错误,无法准确判断建表结果。 - 类属性定义不匹配:你代码中第一行定义的
sql_create_table是全局变量,但建表函数中调用的是self.sql_create_table类属性,如果没有提前把全局变量赋值给类属性,执行建表操作时会直接抛出属性不存在的异常,被except捕获后仅打印错误,你没注意到的话也会误以为建表成功,实际建表SQL根本没有执行。 - 插入语句的
self.sql_insert变量未正确定义:如果你的插入SQL中的表名写错、语法存在错误,也会触发类似报错,你没有贴出sql_insert的定义内容,需要优先检查这部分。
解决方法
- 修正建表SQL,增加
IF NOT EXISTS判断,避免重复建表时报错:
sql_create_table = "CREATE TABLE IF NOT EXISTS employee (ID INTEGER, title TEXT, firstname TEXT, surname TEXT, email TEXT, salary INTEGER)"
- 检查类属性赋值,确保
self.sql_create_table和self.sql_insert都被正确赋值,不要混用全局变量和类属性。参考插入SQL写法如下:
sql_insert = "INSERT INTO employee (ID, title, firstname, surname, email, salary) VALUES (?,?,?,?,?,?)"
- 新增建表结果校验逻辑,建表完成后执行查询确认表是否真的创建成功:
# 建表、提交后增加这段校验逻辑 self.cur.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='employee'") if not self.cur.fetchone(): raise Exception("employee表创建失败")
- 可以直接通过sqlite3命令行工具打开
People.db文件,执行.tables命令查看库内所有表,确认employee表是否真实存在,进一步校验文件路径是否确实一致。
内容的提问来源于stack exchange,提问作者ssa
相关产品推荐
相关产品推荐

