SQLite新手求助:如何实现数据库备份?现有代码无法正常运行
解决SQLite备份脚本无法运行的问题
嘿,作为SQLite新手碰到备份代码跑不起来确实挺让人沮丧的,我帮你梳理下问题根源,并提供一个完整、可运行且符合SQLite安全备份规范的方案~
原代码可能的问题
你提供的代码片段不完整(def sqlite3_backup(dbfile...后面没有函数体),而且直接用shutil复制数据库文件存在风险——如果数据库正在被写入,直接复制会导致备份文件损坏。SQLite官方推荐使用内置的Backup API来完成安全备份。
修复后的完整可运行代码
from __future__ import print_function from __future__ import unicode_literals import argparse import sqlite3 import shutil import time import os from datetime import datetime, timedelta NO_OF_DAYS = 7 # 保留最近7天的备份 def sqlite3_backup(db_file, backup_dir): # 创建备份目录(如果不存在) os.makedirs(backup_dir, exist_ok=True) # 生成带时间戳的备份文件名 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") backup_file = os.path.join(backup_dir, f"{os.path.basename(db_file)}.{timestamp}.bak") try: # 连接源数据库 src_conn = sqlite3.connect(db_file) # 连接备份数据库(自动创建) dst_conn = sqlite3.connect(backup_file) # 使用SQLite Backup API执行备份 with dst_conn: src_conn.backup(dst_conn) print(f"备份成功:{backup_file}") except Exception as e: print(f"备份失败:{str(e)}") # 如果备份失败,删除无效文件 if os.path.exists(backup_file): os.remove(backup_file) finally: # 关闭数据库连接 src_conn.close() dst_conn.close() def cleanup_old_backups(backup_dir): # 计算过期时间点 cutoff_date = datetime.now() - timedelta(days=NO_OF_DAYS) for filename in os.listdir(backup_dir): file_path = os.path.join(backup_dir, filename) if os.path.isfile(file_path): # 获取文件修改时间 file_mtime = datetime.fromtimestamp(os.path.getmtime(file_path)) if file_mtime < cutoff_date: os.remove(file_path) print(f"已删除过期备份:{file_path}") if __name__ == "__main__": # 解析命令行参数 parser = argparse.ArgumentParser(description="SQLite数据库备份工具") parser.add_argument("db_file", help="要备份的SQLite数据库文件路径") parser.add_argument("-b", "--backup-dir", default="./backups", help="备份文件存储目录(默认:./backups)") args = parser.parse_args() # 检查源数据库是否存在 if not os.path.exists(args.db_file): print(f"错误:数据库文件 {args.db_file} 不存在!") exit(1) # 执行备份 sqlite3_backup(args.db_file, args.backup_dir) # 清理旧备份 cleanup_old_backups(args.backup_dir)
关键说明
- 安全备份:使用
sqlite3.Connection.backup()方法,这是SQLite官方提供的原子性备份方式,即使数据库正在被读写也能生成完整可用的备份。 - 自动清理:脚本会自动删除7天前的旧备份,避免备份文件过多占用空间。
- 命令行参数:支持指定数据库路径和备份目录,使用更灵活。
使用方法
在命令行运行脚本:
# 基本用法(备份到默认./backups目录) python sqlite_backup.py your_database.db # 指定备份目录 python sqlite_backup.py your_database.db --backup-dir /path/to/your/backup/folder
内容的提问来源于stack exchange,提问作者Narac Snave
相关产品推荐
相关产品推荐

