30 lines
1.2 KiB
Python
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))
|