"""Create a consistent SQLite backup without copying a live database file.""" import argparse import os import sqlite3 from datetime import datetime from pathlib import Path def backup_database(data_dir): instance = Path(data_dir).resolve() / 'instance' source = instance / 'po.db' if not source.is_file(): raise FileNotFoundError('未找到数据库:%s' % source) destination_dir = instance / 'backups' destination_dir.mkdir(exist_ok=True) destination = destination_dir / ('po-' + datetime.now().strftime('%Y%m%d-%H%M%S-%f') + '.db') with sqlite3.connect(source.as_uri() + '?mode=ro', uri=True) as original: with sqlite3.connect(destination) as copy: original.backup(copy) if copy.execute('PRAGMA integrity_check').fetchone()[0] != 'ok': raise RuntimeError('备份完整性检查未通过:%s' % destination) return destination if __name__ == '__main__': parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--data-dir', default=os.environ.get('PO_DATA_DIR', str(Path(__file__).resolve().parents[1] / 'po_app'))) args = parser.parse_args() print(backup_database(args.data_dir))