|
@@ -0,0 +1,47 @@
|
|
|
+# 数据库备份核心模块:backup_utils.py
|
|
|
+import os
|
|
|
+import shutil
|
|
|
+from datetime import datetime
|
|
|
+from django.conf import settings
|
|
|
+import sqlite3
|
|
|
+from pathlib import Path
|
|
|
+import logging
|
|
|
+
|
|
|
+logger = logging.getLogger(__name__)
|
|
|
+
|
|
|
+def backup_database():
|
|
|
+ """执行数据库备份,返回备份路径"""
|
|
|
+ try:
|
|
|
+ # 源数据库路径(根据您的项目配置调整)
|
|
|
+ source_db = Path(settings.BASE_DIR) / 'db.sqlite3'
|
|
|
+
|
|
|
+ if not source_db.exists():
|
|
|
+ raise FileNotFoundError(f"数据库文件不存在: {source_db}")
|
|
|
+
|
|
|
+ # 生成备份目录路径
|
|
|
+ now = datetime.now()
|
|
|
+ year_month = now.strftime("%Y%m") # 202507
|
|
|
+ day_time = now.strftime("%m%d_%H_%M") # 0728_14_45
|
|
|
+ backup_dir = Path(f"E:/code/backup/{year_month}/{day_time}")
|
|
|
+
|
|
|
+
|
|
|
+ # 创建备份目录
|
|
|
+ backup_dir.mkdir(parents=True, exist_ok=True)
|
|
|
+
|
|
|
+ # 目标备份路径
|
|
|
+ backup_path = backup_dir / f"db.sqlite3"
|
|
|
+
|
|
|
+ # 使用SQLite在线备份API确保备份完整性
|
|
|
+ con = sqlite3.connect(source_db)
|
|
|
+ bck = sqlite3.connect(backup_path)
|
|
|
+ with bck:
|
|
|
+ con.backup(bck, pages=1)
|
|
|
+ bck.close()
|
|
|
+ con.close()
|
|
|
+
|
|
|
+ logger.info(f"数据库备份成功: {backup_path}")
|
|
|
+ return str(backup_path)
|
|
|
+
|
|
|
+ except Exception as e:
|
|
|
+ logger.error(f"数据库备份失败: {str(e)}")
|
|
|
+ raise
|