bootstrap.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. """Create tables and seed MySQL when the user table is empty."""
  2. import os
  3. import shutil
  4. import subprocess
  5. import sys
  6. from pathlib import Path
  7. from app import create_app
  8. from app.models import User, db
  9. def main() -> None:
  10. app = create_app()
  11. with app.app_context():
  12. db.create_all()
  13. if User.query.count() > 0:
  14. print("Database already initialized, skipping seed.")
  15. return
  16. sql_path = os.path.join(os.getcwd(), "sql", "seed_snapshot.sql")
  17. if not os.path.isfile(sql_path):
  18. sql_path = os.path.join(os.getcwd(), "sql", "init_db.sql")
  19. if not os.path.isfile(sql_path):
  20. print("Seed file not found: sql/seed_snapshot.sql or sql/init_db.sql", file=sys.stderr)
  21. sys.exit(1)
  22. host = os.environ["MYSQL_HOST"]
  23. port = os.environ.get("MYSQL_PORT", "3306")
  24. user = os.environ["MYSQL_USER"]
  25. password = os.environ["MYSQL_PASSWORD"]
  26. database = os.environ["MYSQL_DATABASE"]
  27. cmd = [
  28. "mysql",
  29. "--default-character-set=utf8mb4",
  30. f"-h{host}",
  31. f"-P{port}",
  32. f"-u{user}",
  33. f"-p{password}",
  34. database,
  35. ]
  36. print(f"Seeding database from {os.path.basename(sql_path)} ...")
  37. with open(sql_path, "rb") as f:
  38. subprocess.run(cmd, stdin=f, check=True)
  39. print("Seed completed.")
  40. snapshot_static = Path("seed_assets/snapshot/static")
  41. if snapshot_static.is_dir():
  42. static_root = Path("app/static")
  43. static_root.mkdir(parents=True, exist_ok=True)
  44. for child in snapshot_static.iterdir():
  45. dst = static_root / child.name
  46. if dst.exists():
  47. shutil.rmtree(dst)
  48. shutil.copytree(child, dst)
  49. print(f"Restored static assets from {snapshot_static}")
  50. if __name__ == "__main__":
  51. main()