Report-Generator / backup.py
Jaimodiji's picture
Upload folder using huggingface_hub
c001f24
import sqlite3
import json
import os
import shutil
import zipfile
def backup_database_and_files(db_path='database.db', backup_dir='backup', zip_filename='backup.zip'):
"""
Exports all tables from the SQLite database to JSON files, backs up associated files,
and creates a zip archive of the backup.
:param db_path: Path to the SQLite database file.
:param backup_dir: Directory to save the backup.
:param zip_filename: Name of the output zip file.
"""
if os.path.exists(backup_dir):
shutil.rmtree(backup_dir)
os.makedirs(backup_dir)
# 1. Backup the database to JSON files
conn = None
try:
conn = sqlite3.connect(db_path)
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
tables = [row[0] for row in cursor.fetchall()]
for table_name in tables:
print(f"Backing up table: {table_name}")
cursor.execute(f"SELECT * FROM {table_name}")
rows = cursor.fetchall()
data = [dict(row) for row in rows]
backup_file_path = os.path.join(backup_dir, f"{table_name}.json")
with open(backup_file_path, 'w') as f:
json.dump(data, f, indent=4)
print(f"Successfully backed up {table_name} to {backup_file_path}")
except sqlite3.Error as e:
print(f"Database error: {e}")
return
finally:
if conn:
conn.close()
# 2. Backup associated files
file_dirs_to_backup = ['output', 'processed', 'uploads']
for dir_name in file_dirs_to_backup:
source_dir = dir_name
dest_dir = os.path.join(backup_dir, dir_name)
if os.path.exists(source_dir):
print(f"Backing up directory: {source_dir}")
shutil.copytree(source_dir, dest_dir)
print(f"Successfully backed up {source_dir} to {dest_dir}")
else:
print(f"Directory not found, skipping: {source_dir}")
# 3. Create a zip archive of the backup directory
print(f"\nCreating zip archive: {zip_filename}")
with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
for root, dirs, files in os.walk(backup_dir):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, backup_dir)
zipf.write(file_path, arcname)
print(f"Successfully created {zip_filename}")
# 4. Clean up the backup directory
shutil.rmtree(backup_dir)
print(f"Cleaned up backup directory: {backup_dir}")
print("\nBackup complete!")
if __name__ == '__main__':
backup_database_and_files()