使用QSqlDatabase将磁盘SQLite数据库导入内存失败问题求助
问题:SQLite磁盘数据库无法导入内存数据库(PySide6实现)
需求
应用启动时将磁盘SQLite数据库导入内存,退出时将内存数据库导出回磁盘。
现有实现:内存转磁盘功能正常
我将Qt论坛的C++代码转为Python实现,目前内存数据库导出到磁盘的功能可正常运行:
import sys from PySide6.QtSql import QSqlDatabase, QSqlQuery # 创建数据库连接 con_mem = QSqlDatabase.addDatabase("QSQLITE", 'con_mem') con_mem.setDatabaseName("file::memory:") con_mem.setConnectOptions('QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE') con_disk = QSqlDatabase.addDatabase("QSQLITE", 'con_disk') con_disk.setDatabaseName("db.sqlite") # 打开连接 if not con_disk.open() and con_mem.open(): print("数据库打开失败") sys.exit(1) db_mem = QSqlDatabase.database('con_mem') db_disk = QSqlDatabase.database('con_disk') def clone_db(scr, des, des_string): print('创建表前') print('源库表: ', scr.tables()) print('目标库表: ', des.tables()) # 在源库创建测试表 createTableQuery = QSqlQuery(scr) createTableQuery.exec( """ CREATE TABLE contacts ( id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, name VARCHAR(40) NOT NULL, job VARCHAR(50), email VARCHAR(40) NOT NULL ) """ ) print('创建表后') print('源库表: ', scr.tables()) print('目标库表: ', des.tables()) # 执行VACUUM导出 VacumQuery = QSqlQuery(scr) VacumQuery.exec(f'VACUUM main INTO "{des_string}"') print('执行VACUUM后') print('源库表: ', scr.tables()) print('目标库表: ', des.tables()) clone_db(db_mem, db_disk, 'db.sqlite')
输出结果
创建表前 源库表: [] 目标库表: [] 创建表后 源库表: ['contacts', 'sqlite_sequence'] 目标库表: [] 执行VACUUM后 源库表: ['contacts', 'sqlite_sequence'] 目标库表: ['contacts', 'sqlite_sequence']
导入失败:磁盘转内存无效果
当交换源库和目标库,尝试将磁盘数据库导入内存时,功能失效:
clone_db(db_disk, db_mem, 'file::memory:')
输出结果
创建表前 源库表: [] 目标库表: [] 创建表后 源库表: ['contacts', 'sqlite_sequence'] 目标库表: [] 执行VACUUM后 源库表: ['contacts', 'sqlite_sequence'] 目标库表: []
磁盘数据库未被克隆到内存中。修改代码捕获错误后:
VacumQuery = QSqlQuery(scr) if not VacumQuery.exec(f'VACUUM main INTO "{des_string}"'): print(VacumQuery.lastError().text())
得到错误信息:
unable to open database: file::memory: Unable to fetch row
尝试过的其他配置(均失败)
测试1
无报错,但未导入数据库,当前目录生成file文件:
# 内存库配置 con_mem.setDatabaseName('file:db?mode=memory&cache=shared') con_mem.setConnectOptions('QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE') # 调用克隆函数 clone_db(db_disk, db_mem, 'file:db?mode=memory&cache=shared')
测试2
无报错,但未导入数据库:
# 内存库配置 con_mem.setDatabaseName(':memory:') con_mem.setConnectOptions('QSQLITE_OPEN_URI;QSQLITE_ENABLE_SHARED_CACHE') # 调用克隆函数 clone_db(db_disk, db_mem, ':memory:')
测试3
无报错,但未导入数据库:
# 内存库配置 con_mem.setDatabaseName(':memory:') con_mem.setConnectOptions('QSQLITE_ENABLE_SHARED_CACHE') # 调用克隆函数 clone_db(db_disk, db_mem, ':memory:')
请问问题出在哪里?
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

