使用SQLite:memory:创建临时数据库提示no such table: list报错如何解决
错误原因
- 内存数据库生命周期问题:SQLite 中使用
:memory:打开的内存数据库仅在当前连接存活时存在,每次调用sqlite3.connect(":memory:")都会生成完全独立的新内存库实例。你在connect()函数中建表后立即关闭了连接,对应的内存库直接销毁,后续insert等函数新建的连接中没有任何表结构,因此触发no such table报错。 - 插入语句参数不匹配:
insert函数中的SQL语句写了5个?占位符,但仅传入3个参数,即使表存在也会触发参数数量不匹配的报错。
修复方案
你可以通过复用同一个数据库连接的方式保证内存库的表结构可被访问,推荐封装为类实现,修复后的可运行代码如下:
import sqlite3 class MemoryDB: def __init__(self): # 初始化时创建一次内存连接,生命周期和实例绑定 self.conn = sqlite3.connect(":memory:") self._create_table() def _create_table(self): cur = self.conn.cursor() cur.execute( "CREATE TABLE IF NOT EXISTS list (id INTEGER PRIMARY KEY, namee VARCHAR, number INTEGER, price INTEGER)" ) self.conn.commit() def insert(self, name, number, price): cur = self.conn.cursor() # 修正占位符数量,和表字段、传入参数匹配 cur.execute( "INSERT INTO list VALUES (NULL, ?, ?, ?)", (name, number, price) ) self.conn.commit() def view(self): cur = self.conn.cursor() cur.execute("SELECT * FROM list") return cur.fetchall() def delete(self, id): cur = self.conn.cursor() cur.execute("DELETE FROM list WHERE id=?", (id,)) self.conn.commit() def close(self): self.conn.close() # 使用示例 if __name__ == "__main__": db = MemoryDB() db.insert('pizza', 2, 6) print(db.view()) db.close()
如果需要保持函数式写法,可以将连接对象定义为全局变量,避免每次操作都新建连接:
import sqlite3 # 全局复用连接 conn = sqlite3.connect(":memory:") def create_table(): cur = conn.cursor() cur.execute( "CREATE TABLE IF NOT EXISTS list (id INTEGER PRIMARY KEY, namee VARCHAR, number INTEGER, price INTEGER)" ) conn.commit() def insert(name, number, price): cur = conn.cursor() cur.execute("INSERT INTO list VALUES (NULL, ?, ?, ?)", (name, number, price)) conn.commit() def view(): cur = conn.cursor() cur.execute("SELECT * FROM list") return cur.fetchall() def delete(id): cur = conn.cursor() cur.execute("DELETE FROM list WHERE id=?", (id,)) conn.commit() # 使用示例 create_table() insert('pizza', 2, 6) print(view()) conn.close()
内容的提问来源于stack exchange,提问作者Mobin Bagheri
相关产品推荐
相关产品推荐

