为何相同代码在macOS与Windows下生成的数据库文件数量不同?
问题:相同代码在Windows与macOS运行后文件结构差异的原因
我在Windows和macOS系统中运行了相同的Python代码,代码如下:
def build_database() -> Database | None: if not os.path.exists('accounts.db'): paths = ['discord.txt', 'facebook.txt', 'google.txt', 'linkedin.txt', 'twitter.txt', 'metamask.txt', 'proxies.txt'] data = [content for content in read_from_files(paths)] parsing_data = ParsingData(*data) with Database('accounts', parsing_data) as db: db.build([ModelType.LINKEDIN, ModelType.FACEBOOK, ModelType.GOOGLE, ModelType.TWITTER, ModelType.DISCORD, ModelType.METAMASK]) return db else: return Database('accounts') def __init__(self, name: str): self.__name = name self.__sql_db = SqliteDatabase(f'{name}.db') self.__is_connected = False
运行后文件结构出现明显差异:
- Windows系统下生成
accounts.db与accounts.db-journal两个文件 - macOS系统下生成
accounts.db与accounts.sqlite两个文件
请问该差异的原因是什么?
原因分析
核心差异源于两方面:SQLite自身的日志机制差异,以及你使用的SqliteDatabase类在不同操作系统下的默认行为:
Windows下的
accounts.db-journal文件
这是SQLite的回滚日志文件,当SQLite未启用WAL(预写日志)模式时,会生成该文件用于事务的回滚与崩溃恢复。在Windows环境中,若你的SqliteDatabase默认未开启WAL模式,事务执行过程中就会创建这个临时文件;正常关闭连接后它会自动删除,程序异常退出时可能残留。macOS下的
accounts.sqlite文件
这个文件的出现大概率是你使用的SqliteDatabase类(如peewee等ORM框架的封装类)在macOS下的默认配置导致:- 部分ORM的
SqliteDatabase实现,在Unix-like系统(包括macOS)中,若传入的数据库文件名未带.sqlite后缀,会自动追加该后缀,同时你代码中明确指定的accounts.db也被创建,最终出现两个数据库文件。 - 也可能是代码中未展示的逻辑在macOS环境下触发了额外的数据库文件创建操作。
- 部分ORM的
此外,需检查SqliteDatabase的初始化参数:若开启WAL模式,SQLite会生成-wal和-shm文件而非-journal,这也会导致日志文件类型的差异。
内容的提问来源于stack exchange,提问作者blnk.off
相关产品推荐
相关产品推荐

