使用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
相关产品推荐
相关产品推荐

