You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:02:08