init_databases.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import argparse
  2. import getpass
  3. import re
  4. import pymysql
  5. from app.core.config import Settings
  6. SAFE_ACCOUNT = re.compile(r"^[A-Za-z0-9_]+$")
  7. def initialize_databases(root_user: str, root_password: str, settings: Settings) -> None:
  8. if not SAFE_ACCOUNT.fullmatch(settings.mysql_user):
  9. raise ValueError("MYSQL_USER 只能包含字母、数字和下划线")
  10. if not settings.mysql_password:
  11. raise ValueError("请先在 .env 中设置 MYSQL_PASSWORD")
  12. connection = pymysql.connect(
  13. host=settings.mysql_host,
  14. port=settings.mysql_port,
  15. user=root_user,
  16. password=root_password,
  17. autocommit=True,
  18. )
  19. databases = (
  20. settings.mysql_core_database,
  21. settings.mysql_agent_database,
  22. settings.mysql_analytics_database,
  23. )
  24. account = f"'{settings.mysql_user}'@'localhost'"
  25. escaped_password = connection.escape(settings.mysql_password)
  26. with connection, connection.cursor() as cursor:
  27. for database in databases:
  28. cursor.execute(
  29. f"CREATE DATABASE IF NOT EXISTS `{database}` "
  30. "CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci"
  31. )
  32. cursor.execute(f"CREATE USER IF NOT EXISTS {account} IDENTIFIED BY {escaped_password}")
  33. for database in databases:
  34. cursor.execute(f"GRANT ALL PRIVILEGES ON `{database}`.* TO {account}")
  35. cursor.execute("FLUSH PRIVILEGES")
  36. def main() -> None:
  37. parser = argparse.ArgumentParser(description="初始化智保通第一阶段 MySQL 三库")
  38. parser.add_argument("--root-user", default="root")
  39. args = parser.parse_args()
  40. password = getpass.getpass(f"MySQL {args.root_user} 密码:")
  41. settings = Settings()
  42. initialize_databases(args.root_user, password, settings)
  43. print(
  44. "已初始化数据库:"
  45. f"{settings.mysql_core_database}、{settings.mysql_agent_database}、"
  46. f"{settings.mysql_analytics_database}"
  47. )
  48. if __name__ == "__main__":
  49. main()