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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:57:01