Python 3.9中SQLite内存表复制到磁盘库时表不存在的问题
解决SQLite内存数据库表复制到磁盘数据库时的表找不到问题
问题根源
你遇到的no such table错误,核心原因是SQLite的:memory:数据库是连接级别的独立实例:
当你通过磁盘数据库的连接执行ATTACH DATABASE ':memory:' AS db;时,这个操作会创建一个全新的空内存数据库,和你之前用conn = sqlite3.connect(":memory:")创建的、已经插入数据的内存库完全是两个独立的对象,自然找不到对应的表。
解决方案一:反向附加磁盘数据库到内存连接
把磁盘库附加到内存数据库的连接上,这样内存连接可以直接访问自己的表,然后执行复制操作:
import sqlite3 # 初始化内存数据库并插入数据 conn = sqlite3.connect(":memory:") cursor = conn.cursor() table_name = "table_name" cursor.execute(f"CREATE TABLE {table_name} (id INTEGER, Value INTEGER, Value2 INTEGER, Category INTEGER);") cursor.execute(f"INSERT INTO {table_name} (id, Value, Value2, Category) " f"VALUES ('1', '20','20', '2')," f"('2', '30','30', '2')," f"('13', '17','17','1');") conn.commit() # 将磁盘数据库附加到内存连接 conn.execute(f"ATTACH DATABASE 'C:\\...\\testfile.sqlite' AS disk_db;") # 从内存表复制到磁盘库的目标表 conn.execute(f"CREATE TABLE disk_db.{table_name} AS SELECT * FROM {table_name};") conn.commit() # 关闭连接 conn.close()
解决方案二:用iterdump导出表SQL并执行
如果需要更灵活控制(比如只复制表结构或部分数据),可以用内存连接的iterdump方法导出表的创建和插入语句,再到磁盘库执行:
import sqlite3 # 内存数据库操作 conn = sqlite3.connect(":memory:") cursor = conn.cursor() table_name = "table_name" cursor.execute(f"CREATE TABLE {table_name} (id INTEGER, Value INTEGER, Value2 INTEGER, Category INTEGER);") cursor.execute(f"INSERT INTO {table_name} (id, Value, Value2, Category) " f"VALUES ('1', '20','20', '2')," f"('2', '30','30', '2')," f"('13', '17','17','1');") conn.commit() # 磁盘数据库操作 file_conn = sqlite3.connect(r"C:\...\testfile.sqlite") file_cursor = file_conn.cursor() # 过滤并执行目标表的SQL语句 for line in conn.iterdump(): if f"CREATE TABLE {table_name}" in line or f"INSERT INTO {table_name}" in line: file_cursor.execute(line) file_conn.commit() file_conn.close() conn.close()
注意事项
- 确保磁盘数据库路径正确,Windows系统下可以用原始字符串(
r"路径")避免转义问题。 - 如果表名包含特殊字符(如空格、关键字),需要用双引号包裹表名,比如
CREATE TABLE "my table" AS SELECT ...。 - 操作完成后务必调用
commit()提交事务,否则数据不会写入磁盘。
内容的提问来源于stack exchange,提问作者MappingThePast
相关产品推荐
相关产品推荐

