migrate_add_has_shared_avatar.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. """
  2. 数据库迁移脚本:为 user_ui_states 表添加 has_shared_avatar 字段
  3. 运行: python migrate_add_has_shared_avatar.py
  4. """
  5. import asyncio
  6. import sys
  7. import aiomysql
  8. from config import settings
  9. async def migrate_add_has_shared_avatar() -> bool:
  10. """为 user_ui_states 表添加 has_shared_avatar 字段"""
  11. try:
  12. conn = await aiomysql.connect(
  13. host=settings.MYSQL_HOST,
  14. port=settings.MYSQL_PORT,
  15. user=settings.MYSQL_USER,
  16. password=settings.MYSQL_PASSWORD,
  17. db=settings.MYSQL_DATABASE,
  18. charset="utf8mb4",
  19. )
  20. async with conn.cursor() as cursor:
  21. # 检查字段是否已存在
  22. await cursor.execute(
  23. """
  24. SELECT COUNT(*)
  25. FROM INFORMATION_SCHEMA.COLUMNS
  26. WHERE TABLE_SCHEMA = %s
  27. AND TABLE_NAME = 'user_ui_states'
  28. AND COLUMN_NAME = 'has_shared_avatar'
  29. """,
  30. (settings.MYSQL_DATABASE,),
  31. )
  32. result = await cursor.fetchone()
  33. if result and result[0] > 0:
  34. conn.close()
  35. return True
  36. # 添加字段,默认 false
  37. await cursor.execute(
  38. """
  39. ALTER TABLE user_ui_states
  40. ADD COLUMN has_shared_avatar TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已分享头像奖励'
  41. AFTER avatar_c_unlocked
  42. """
  43. )
  44. await conn.commit()
  45. conn.close()
  46. return True
  47. except Exception:
  48. import traceback
  49. traceback.print_exc()
  50. return False
  51. if __name__ == "__main__":
  52. if len(sys.argv) > 1 and sys.argv[1] == "--force":
  53. confirm = "y"
  54. else:
  55. confirm = input("\n是否继续执行迁移? (y/n): ")
  56. if confirm.lower() != "y":
  57. sys.exit(0)
  58. ok = asyncio.run(migrate_add_has_shared_avatar())
  59. if not ok:
  60. sys.exit(1)