Files

30 lines
1.2 KiB
Python

"""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))