| |
| """ |
| 存储后端数据迁移脚本 |
| |
| 用法: |
| python scripts/migrate_storage.py --from json --to postgres |
| python scripts/migrate_storage.py --from postgres --to git |
| python scripts/migrate_storage.py --export accounts.json |
| python scripts/migrate_storage.py --import accounts.json |
| """ |
|
|
| import argparse |
| import json |
| import os |
| import sys |
| from pathlib import Path |
|
|
| |
| sys.path.insert(0, str(Path(__file__).resolve().parents[1])) |
|
|
| DATA_DIR = Path(__file__).resolve().parents[1] / "data" |
|
|
| from services.storage.factory import create_storage_backend |
|
|
|
|
| def export_to_json(output_file: str): |
| """导出当前存储后端的数据到 JSON 文件""" |
| print(f"[migrate] Exporting data to {output_file}") |
| DATA_DIR.mkdir(parents=True, exist_ok=True) |
| storage = create_storage_backend(DATA_DIR) |
| accounts = storage.load_accounts() |
| |
| output_path = Path(output_file) |
| output_path.parent.mkdir(parents=True, exist_ok=True) |
| output_path.write_text( |
| json.dumps(accounts, ensure_ascii=False, indent=2) + "\n", |
| encoding="utf-8", |
| ) |
| |
| print(f"[migrate] Exported {len(accounts)} accounts to {output_file}") |
|
|
|
|
| def import_from_json(input_file: str): |
| """从 JSON 文件导入数据到当前存储后端""" |
| print(f"[migrate] Importing data from {input_file}") |
| DATA_DIR.mkdir(parents=True, exist_ok=True) |
| input_path = Path(input_file) |
| if not input_path.exists(): |
| print(f"[migrate] Error: File not found: {input_file}") |
| sys.exit(1) |
| |
| try: |
| accounts = json.loads(input_path.read_text(encoding="utf-8")) |
| if not isinstance(accounts, list): |
| print(f"[migrate] Error: Invalid JSON format, expected array") |
| sys.exit(1) |
| except json.JSONDecodeError as e: |
| print(f"[migrate] Error: Invalid JSON: {e}") |
| sys.exit(1) |
| |
| storage = create_storage_backend(DATA_DIR) |
| storage.save_accounts(accounts) |
| |
| print(f"[migrate] Imported {len(accounts)} accounts") |
|
|
|
|
| def migrate_data(from_backend: str, to_backend: str): |
| """从一个存储后端迁移到另一个""" |
| print(f"[migrate] Migrating from {from_backend} to {to_backend}") |
| DATA_DIR.mkdir(parents=True, exist_ok=True) |
| |
| original_backend = os.environ.get("STORAGE_BACKEND") |
| |
| try: |
| |
| os.environ["STORAGE_BACKEND"] = from_backend |
| from_storage = create_storage_backend(DATA_DIR) |
| accounts = from_storage.load_accounts() |
| print(f"[migrate] Loaded {len(accounts)} accounts from {from_backend}") |
| |
| |
| os.environ["STORAGE_BACKEND"] = to_backend |
| to_storage = create_storage_backend(DATA_DIR) |
| to_storage.save_accounts(accounts) |
| print(f"[migrate] Saved {len(accounts)} accounts to {to_backend}") |
| |
| print(f"[migrate] Migration completed successfully!") |
| |
| finally: |
| |
| if original_backend: |
| os.environ["STORAGE_BACKEND"] = original_backend |
| elif "STORAGE_BACKEND" in os.environ: |
| del os.environ["STORAGE_BACKEND"] |
|
|
|
|
| def main(): |
| parser = argparse.ArgumentParser( |
| description="ChatGPT2API 存储后端数据迁移工具", |
| formatter_class=argparse.RawDescriptionHelpFormatter, |
| epilog=""" |
| 示例: |
| # 从 JSON 迁移到 PostgreSQL |
| python scripts/migrate_storage.py --from json --to postgres |
| |
| # 从 PostgreSQL 迁移到 Git |
| python scripts/migrate_storage.py --from postgres --to git |
| |
| # 导出当前数据到 JSON 文件 |
| python scripts/migrate_storage.py --export backup.json |
| |
| # 从 JSON 文件导入数据 |
| python scripts/migrate_storage.py --import backup.json |
| |
| 环境变量: |
| STORAGE_BACKEND - 存储后端类型 (json, sqlite, postgres, git) |
| DATABASE_URL - 数据库连接字符串 |
| GIT_REPO_URL - Git 仓库地址 |
| GIT_TOKEN - Git 访问令牌 |
| """ |
| ) |
| |
| parser.add_argument( |
| "--from", |
| dest="from_backend", |
| choices=["json", "sqlite", "postgres", "git"], |
| help="源存储后端", |
| ) |
| parser.add_argument( |
| "--to", |
| dest="to_backend", |
| choices=["json", "sqlite", "postgres", "git"], |
| help="目标存储后端", |
| ) |
| parser.add_argument( |
| "--export", |
| dest="export_file", |
| metavar="FILE", |
| help="导出数据到 JSON 文件", |
| ) |
| parser.add_argument( |
| "--import", |
| dest="import_file", |
| metavar="FILE", |
| help="从 JSON 文件导入数据", |
| ) |
| |
| args = parser.parse_args() |
| |
| |
| if args.from_backend and args.to_backend: |
| migrate_data(args.from_backend, args.to_backend) |
| elif args.export_file: |
| export_to_json(args.export_file) |
| elif args.import_file: |
| import_from_json(args.import_file) |
| else: |
| parser.print_help() |
| sys.exit(1) |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|