SQLite3将数据存储在一个或多个文件中(对于WAL模式)并通过复制数据库文件提出了一种解决方案(示例):
def db_create_backup(
log: logging.Logger,
backup_dir=BACKUP_DIR_NAME,
date_fmt="%Y-%m-%d",
):
backup_path = Path(backup_dir)
backup_path_db = backup_path / DB_DIR_NAME.name
backup_path_db.mkdir(parents=True, exist_ok=True)
...
zip_name = dt.datetime.today().strftime(date_fmt)
zip_name = backup_path_db / zip_name
attempts = 5
for i in range(attempts):
try:
log.info(f"Создание бэкапа базы данных в: {zip_name}")
shutil.make_archive(zip_name, "zip", DB_DIR_NAME)
...
但尽管这种解决方案效率很高,但它还是引起了人们的怀疑——它看起来像自行车拐杖。
是否可以更正确地创建 sqlite3 备份?
在 sql 命令中找到了一个解决方案(但我会推荐sqlite3.Connection.backup的答案中的解决方案) 。您需要将一个字符串传递给它,因此如果使用pathlib.Path,您将需要转换为该字符串。此外,该命令不知道如何覆盖现有文件(如果它尚未为空),因此您需要删除该文件。
VACUUM INTO {filename}从好的方面来说,此命令可以从内存中卸载数据库 (
:memory:)算法:
实现及示例:
第二种选择是通过Backup API,它是通过sqlite3.Connection.backup连接方法实现的(参见 1、参见 2 ) (感谢needKVAS提供的信息)
就像
VACUUM INTO它可以使用一样:memory:,但与它不同的是,不需要清理文件/数据库 - 备份不会累积以前的值算法(最小选项):
算法(扩展版-表示上传增量,记录过程):
实现及示例: