migrate_add_user_level.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """
  2. 数据库迁移脚本:为 users 表添加 user_level 字段
  3. 运行: python migrate_add_user_level.py
  4. """
  5. import asyncio
  6. import sys
  7. import aiomysql
  8. from config import settings
  9. async def migrate_add_user_level():
  10. """为 users 表添加 user_level 字段"""
  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. await cursor.execute(
  22. """
  23. SELECT COUNT(*)
  24. FROM INFORMATION_SCHEMA.COLUMNS
  25. WHERE TABLE_SCHEMA = %s
  26. AND TABLE_NAME = 'users'
  27. AND COLUMN_NAME = 'user_level'
  28. """,
  29. (settings.MYSQL_DATABASE,),
  30. )
  31. result = await cursor.fetchone()
  32. if result and result[0] > 0:
  33. conn.close()
  34. return True
  35. await cursor.execute(
  36. """
  37. ALTER TABLE users
  38. ADD COLUMN user_level INT NOT NULL DEFAULT 0 COMMENT '用户等级(0-5)'
  39. AFTER total_speech_duration_ms
  40. """
  41. )
  42. await conn.commit()
  43. conn.close()
  44. return True
  45. except Exception:
  46. import traceback
  47. traceback.print_exc()
  48. return False
  49. if __name__ == "__main__":
  50. if len(sys.argv) > 1 and sys.argv[1] == "--force":
  51. confirm = "y"
  52. else:
  53. confirm = input("\n是否继续执行迁移? (y/n): ")
  54. if confirm.lower() != "y":
  55. sys.exit(0)
  56. success = asyncio.run(migrate_add_user_level())
  57. if not success:
  58. sys.exit(1)