migrate_from_firebase의 소스 코드

"""
Firebase Firestore → SQLite 마이그레이션 스크립트

사용법:
  1. Firebase Console → 프로젝트 설정 → 서비스 계정 → 새 비공개 키 생성
  2. 다운로드한 JSON 파일을 이 파일과 같은 폴더에 'serviceAccountKey.json' 이름으로 저장
  3. 실행: python migrate_from_firebase.py
"""

import os
import json
import sqlite3
from datetime import datetime

SERVICE_ACCOUNT_KEY = "serviceAccountKey.json"
DATABASE = "tobaccobug.db"


[문서] def init_db(db): db.execute("PRAGMA foreign_keys = ON") db.execute(""" CREATE TABLE IF NOT EXISTS cages ( id TEXT PRIMARY KEY, type TEXT NOT NULL, label TEXT NOT NULL, current_status TEXT DEFAULT '{}', updated_at TEXT ) """) db.execute(""" CREATE TABLE IF NOT EXISTS logs ( id TEXT PRIMARY KEY, cage_id TEXT NOT NULL, kind TEXT NOT NULL, date TEXT, data TEXT DEFAULT '{}', created_at TEXT, FOREIGN KEY (cage_id) REFERENCES cages(id) ON DELETE CASCADE ) """) db.commit()
[문서] def migrate(): if not os.path.exists(SERVICE_ACCOUNT_KEY): print(f"❌ '{SERVICE_ACCOUNT_KEY}' 파일을 찾을 수 없습니다.") print(" Firebase Console → 프로젝트 설정 → 서비스 계정 → 새 비공개 키 생성") return try: import firebase_admin from firebase_admin import credentials, firestore except ImportError: print("❌ firebase-admin 패키지가 없습니다. 먼저 설치하세요:") print(" pip install firebase-admin") return print("🔥 Firebase에 연결 중...") cred = credentials.Certificate(SERVICE_ACCOUNT_KEY) firebase_admin.initialize_app(cred) fs = firestore.client() db = sqlite3.connect(DATABASE) init_db(db) cage_count = 0 log_count = 0 print("📦 데이터 가져오는 중...") for cage_doc in fs.collection("cages").stream(): cage_data = cage_doc.to_dict() cage_id = cage_doc.id db.execute( "INSERT OR REPLACE INTO cages (id, type, label, current_status, updated_at) VALUES (?, ?, ?, ?, ?)", ( cage_id, cage_data.get("type", "big"), cage_data.get("label", cage_id), json.dumps(cage_data.get("currentStatus", {})), cage_data.get("updatedAt", datetime.now().isoformat()), ) ) cage_count += 1 for log_doc in fs.collection("cages").document(cage_id).collection("logs").stream(): log_data = log_doc.to_dict() kind = log_data.get("kind", "note") date = log_data.get("date") created_at = log_data.get("createdAt", datetime.now().isoformat()) extra = {k: v for k, v in log_data.items() if k not in ("kind", "date", "createdAt")} db.execute( "INSERT OR REPLACE INTO logs (id, cage_id, kind, date, data, created_at) VALUES (?, ?, ?, ?, ?, ?)", (log_doc.id, cage_id, kind, date, json.dumps(extra), created_at) ) log_count += 1 db.commit() db.close() print(f"✅ 완료: 케이지 {cage_count}개, 로그 {log_count}개 → {DATABASE}")
if __name__ == "__main__": migrate()