migrate_ab_subtitle_settings_init.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. """
  2. A/B 组字幕开关配置表:建表 + 种子数据(A=0 关,B=1 开)
  3. 运行(在 backend 目录): python migrations/migrate_ab_subtitle_settings_init.py
  4. """
  5. import asyncio
  6. import sys
  7. from pathlib import Path
  8. from typing import Any
  9. sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
  10. import aiomysql
  11. from config import settings
  12. MIGRATIONS_DIR = Path(__file__).resolve().parent
  13. async def table_exists(cursor: Any) -> bool:
  14. await cursor.execute(
  15. """
  16. SELECT COUNT(*) FROM information_schema.tables
  17. WHERE table_schema = %s AND table_name = 'ab_subtitle_settings'
  18. """,
  19. (settings.MYSQL_DATABASE,),
  20. )
  21. row = await cursor.fetchone()
  22. return bool(row and row[0] > 0)
  23. async def migrate() -> bool:
  24. try:
  25. conn: aiomysql.Connection = await aiomysql.connect(
  26. host=settings.MYSQL_HOST,
  27. port=settings.MYSQL_PORT,
  28. user=settings.MYSQL_USER,
  29. password=settings.MYSQL_PASSWORD,
  30. db=settings.MYSQL_DATABASE,
  31. charset="utf8mb4",
  32. )
  33. async with conn.cursor() as cursor:
  34. if not await table_exists(cursor):
  35. print("🔄 创建 ab_subtitle_settings 表...")
  36. ddl = (MIGRATIONS_DIR / "add_ab_subtitle_settings_table.sql").read_text(encoding="utf-8")
  37. for stmt in [s.strip() for s in ddl.split(";") if s.strip()]:
  38. if stmt.upper().startswith("SET NAMES"):
  39. continue
  40. await cursor.execute(stmt)
  41. await conn.commit()
  42. print("✅ ab_subtitle_settings 表创建完成")
  43. else:
  44. print("✅ ab_subtitle_settings 表已存在")
  45. await cursor.execute(
  46. """
  47. INSERT INTO ab_subtitle_settings (group_key, subtitle_on) VALUES
  48. ('A', 0),
  49. ('B', 1)
  50. ON DUPLICATE KEY UPDATE group_key = VALUES(group_key)
  51. """
  52. )
  53. await conn.commit()
  54. print("✅ A/B 组种子数据已确保存在")
  55. await cursor.execute(
  56. "SELECT group_key, subtitle_on, updated_at FROM ab_subtitle_settings ORDER BY group_key"
  57. )
  58. rows = await cursor.fetchall()
  59. print("📊 当前配置:", rows)
  60. conn.close()
  61. return True
  62. except Exception:
  63. import traceback
  64. traceback.print_exc()
  65. return False
  66. if __name__ == "__main__":
  67. confirm = input("\n是否继续执行迁移? (y/n): ") if len(sys.argv) <= 1 or sys.argv[1] != "--force" else "y"
  68. if confirm.lower() != "y":
  69. sys.exit(0)
  70. ok: Any = asyncio.run(migrate())
  71. sys.exit(0 if ok else 1)