基于sqlite3搭建内存数据库出现no such table及Tkinter报错如何解决
报错排查与解决
第一类:NameError报错
这类报错和Sqlite内存数据库无关,是独立的代码导入/定义问题:
- 报错原因:你在代码中调用的
main_screen()、user_screen()函数,在当前运行的作用域中没有被定义或正确导入 - 解决方法:
- 检查两个函数所在的源文件,确认函数名称没有拼写错误
- 在调用这两个函数的文件头部,通过
from 对应文件路径 import main_screen, user_screen语句导入目标函数
第二类:sqlite3.OperationalError: no such table: itm
这是内存数据库使用方式错误导致的核心问题:
- 报错原因:Sqlite的
:memory:数据库完全和连接对象绑定,每次执行sqlite3.connect(":memory:")都会生成一个全新的、独立的空内存数据库。你当前的代码每个操作函数内都新建了连接,相当于建表操作在A连接的内存库执行,插入操作在B连接的空内存库执行,自然找不到表结构。同时你在connect()函数内创建的连接会在函数运行结束后自动销毁,完全没有被复用。
正确实现Sqlite3内存数据库的方案
注意:内存数据库的所有数据仅在连接存活期间存在,一旦连接关闭所有数据会被清空。程序运行过程中不要手动关闭连接,直到程序完全退出前再执行关闭操作即可。
方案1:全局连接复用(适合小型项目)
直接将连接对象设为全局变量,所有操作复用同一个连接:
import sqlite3 # 全局连接、游标对象,全程复用 conn = None cur = None def connect(): global conn, cur conn = sqlite3.connect(":memory:") cur = conn.cursor() cur.execute( """CREATE TABLE itm (id INTEGER PRIMARY KEY , namee VARCHAR , numbers INTEGER , price INTEGER )""") conn.commit() def insert(name, number, price): global conn, cur cur.execute( """INSERT INTO itm VALUES(NULL , ?, ?,?)""",(name, number, price) ) conn.commit() def view(): global cur cur.execute("SELECT * FROM itm") rows = cur.fetchall() return rows def delete(id): global conn, cur cur.execute("DELETE FROM itm WHERE id=?", (id,)) conn.commit() # 项目启动时初始化一次连接即可 connect()
方案2:类封装(适合中大型项目,避免全局变量污染)
用类封装连接和所有操作,确保连接唯一:
import sqlite3 class MemoryDB: def __init__(self): # 类初始化时创建唯一连接,所有方法复用该连接 self.conn = sqlite3.connect(":memory:") self.cur = self.conn.cursor() self._init_table() def _init_table(self): self.cur.execute( """CREATE TABLE itm (id INTEGER PRIMARY KEY , namee VARCHAR , numbers INTEGER , price INTEGER )""" ) self.conn.commit() def insert(self, name, number, price): self.cur.execute( """INSERT INTO itm VALUES(NULL , ?, ?,?)""",(name, number, price) ) self.conn.commit() def view(self): self.cur.execute("SELECT * FROM itm") return self.cur.fetchall() def delete(self, id): self.cur.execute("DELETE FROM itm WHERE id=?", (id,)) self.conn.commit() def close(self): # 程序退出前手动调用该方法关闭连接 self.conn.close() # 项目全局实例化一次,所有逻辑复用该实例即可 db = MemoryDB()
内容的提问来源于stack exchange,提问作者Mobin Bagheri
相关产品推荐
相关产品推荐

