migrate_add_user_ui_state_table.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. """
  2. 数据库迁移脚本:创建 user_ui_states 表
  3. 运行: python migrate_add_user_ui_state_table.py
  4. """
  5. import asyncio
  6. import sys
  7. from typing import Any
  8. import aiomysql
  9. from config import settings
  10. async def migrate_create_user_ui_states_table() -> bool:
  11. """创建 user_ui_states 表(如果不存在)"""
  12. try:
  13. conn: aiomysql.Connection = await aiomysql.connect(
  14. host=settings.MYSQL_HOST,
  15. port=settings.MYSQL_PORT,
  16. user=settings.MYSQL_USER,
  17. password=settings.MYSQL_PASSWORD,
  18. db=settings.MYSQL_DATABASE,
  19. charset="utf8mb4",
  20. )
  21. async with conn.cursor() as cursor:
  22. # 检查表是否已存在
  23. await cursor.execute(
  24. """
  25. SELECT COUNT(*) FROM information_schema.tables
  26. WHERE table_schema = %s AND table_name = 'user_ui_states'
  27. """,
  28. (settings.MYSQL_DATABASE,),
  29. )
  30. exists_row: Any = await cursor.fetchone()
  31. table_exists = bool(exists_row and exists_row[0] > 0)
  32. if table_exists:
  33. print("✅ user_ui_states 表已存在,无需迁移")
  34. await conn.ensure_closed()
  35. return True
  36. print("🔄 创建 user_ui_states 表...")
  37. await cursor.execute(
  38. """
  39. CREATE TABLE user_ui_states (
  40. id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
  41. user_id VARCHAR(64) NOT NULL UNIQUE COMMENT '用户ID(关联 users.user_id)',
  42. current_page VARCHAR(64) NULL COMMENT '当前业务流程页面标识',
  43. visited_routes JSON NULL COMMENT '已访问路由列表',
  44. has_shown_tap_to_chat TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已展示 TapToChat 提示',
  45. has_shown_cancel_tooltip TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已展示取消按钮提示',
  46. has_shown_send_tooltip TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已展示发送按钮提示',
  47. has_shown_progress_bar_tooltip TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已展示进度条提示',
  48. avatar_c_unlocked TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已解锁 Avatar-C',
  49. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  50. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  51. INDEX idx_user_ui_state_user_id (user_id)
  52. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户前端可视化状态表';
  53. """
  54. )
  55. await conn.commit()
  56. print("✅ user_ui_states 表创建完成")
  57. await conn.ensure_closed()
  58. return True
  59. except Exception as exc: # noqa: BLE001
  60. import traceback
  61. print(f"❌ 迁移失败: {exc}")
  62. traceback.print_exc()
  63. return False
  64. if __name__ == "__main__":
  65. if len(sys.argv) > 1 and sys.argv[1] == "--force":
  66. confirm = "y"
  67. else:
  68. confirm = input("\n是否继续创建 user_ui_states 表? (y/n): ")
  69. if confirm.lower() != "y":
  70. sys.exit(0)
  71. ok = asyncio.run(migrate_create_user_ui_states_table())
  72. if not ok:
  73. sys.exit(1)