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

使用APSW模块为SQLite实现内存VFS时写入磁盘后出现表重复问题求助

APSW模块为SQLite实现内存VFS时写入磁盘后出现表重复问题求助

各位好,我最近一直在用Python的apsw模块给SQLite3实现一个自定义VFS,目标是把现有数据库加载到内存里操作——我知道SQLite本身有内存数据库支持,但据我所知它没办法直接把已有的磁盘数据库导入内存(如果我理解错了也欢迎指正)。

我的VFS会接收一个db_bytes对象(通过读取磁盘上的数据库文件得到,代码如下):

with open('database.db', 'rb') as f:
    db_bytes = f.read()

之后我实现了VFS所需的所有操作(比如xRead、xWrite这些),目前读写都能正常通过SQL连接完成,用BytesIO做缓冲也没什么问题。但遇到一个奇怪的问题:当我往表里插入数据后,把BytesIO缓冲写回磁盘,再用hexdump查看时,发现表居然重复了。

下面是我简化后的实现代码:

from io import BytesIO
import apsw

class VolatileFS(apsw.VFS):
    def __init__(self, db_bytes, vfsname='volatilefs', basevfs=''):
        self.vfs_name = vfsname
        self.base_vfs = basevfs
        self.db = BytesIO(db_bytes)
        super().__init__(self.vfs_name, self.base_vfs)

    def xOpen(self, name: str, flags: Iterable[int]):
        self.file = VolatileFSFile(self.db, self.base_vfs, name, flags)
        return self.file

class VolatileFSFile(apsw.VFSFile):
    def __init__(self, db, inheritfromvfsname, filename, flags):
        self.buffer = db
        super().__init__(inheritfromvfsname, filename, flags)

    def xClose(self):
        super().xClose()

    def xRead(self, amount: int, offset: int):
        self.buffer.seek(offset)
        data = self.buffer.read(amount)
        if len(data) < amount:
            data += b'\x00' * (amount - len(data))
        return data
        # return super().xRead(amount, offset)

    def xWrite(self, data: bytes, offset: int):
        if len(self.buffer.getvalue()) < offset + len(data):
            size = offset + len(data) - len(self.buffer.getvalue())
            self.buffer.seek(0, 2)
            self.buffer.write(b'\x00' * size)
        self.buffer.seek(offset)
        self.buffer.write(data)

    def xTruncate(self, size: int):
        current = self.buffer.getvalue()
        self.buffer = current[:size]

    def xFileSize(self) -> int:
        return len(self.buffer.getvalue())

有没有大佬能帮我看看问题出在哪?或者给点排查方向也行,非常感谢!


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:08:08