migrate_add_area_code_to_users.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. """
  2. 数据库迁移脚本:为 users 表添加 area_code 字段
  3. 运行: python migrate_add_area_code_to_users.py
  4. """
  5. import asyncio
  6. import sys
  7. import aiomysql
  8. from config import settings
  9. async def migrate_add_area_code_column() -> bool:
  10. """为 users 表添加 area_code 字段"""
  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. # 检查 users 表是否存在
  22. await cursor.execute(
  23. """
  24. SELECT COUNT(*) FROM information_schema.tables
  25. WHERE table_schema = %s AND table_name = 'users'
  26. """,
  27. (settings.MYSQL_DATABASE,),
  28. )
  29. table_exists = (await cursor.fetchone())[0] > 0
  30. if not table_exists:
  31. print("❌ users 表不存在,请先创建表")
  32. conn.close()
  33. return False
  34. # 检查 area_code 列是否已存在
  35. await cursor.execute(
  36. """
  37. SELECT COUNT(*) FROM information_schema.columns
  38. WHERE table_schema = %s
  39. AND table_name = 'users'
  40. AND column_name = 'area_code'
  41. """,
  42. (settings.MYSQL_DATABASE,),
  43. )
  44. has_area_code = (await cursor.fetchone())[0] > 0
  45. if has_area_code:
  46. print("✅ area_code 字段已存在,无需迁移")
  47. conn.close()
  48. return True
  49. print("🔄 添加 area_code 字段...")
  50. await cursor.execute(
  51. """
  52. ALTER TABLE users
  53. ADD COLUMN area_code VARCHAR(10) NULL COMMENT '手机区号(如 +86)' AFTER user_type
  54. """
  55. )
  56. print("✅ area_code 字段添加成功")
  57. await conn.commit()
  58. print("✅ 迁移完成")
  59. conn.close()
  60. return True
  61. except Exception as e: # noqa: BLE001
  62. import traceback
  63. print(f"❌ 迁移失败: {e}")
  64. traceback.print_exc()
  65. return False
  66. if __name__ == "__main__":
  67. # 确认是否继续
  68. if len(sys.argv) > 1 and sys.argv[1] == "--force":
  69. confirm = "y"
  70. else:
  71. confirm = input("\n是否继续迁移 users 表添加 area_code 字段? (y/n): ")
  72. if confirm.lower() != "y":
  73. sys.exit(0)
  74. success = asyncio.run(migrate_add_area_code_column())
  75. if not success:
  76. sys.exit(1)