| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- """
- 数据库迁移脚本:为 users 表添加 area_code 字段
- 运行: python migrate_add_area_code_to_users.py
- """
- import asyncio
- import sys
- import aiomysql
- from config import settings
- async def migrate_add_area_code_column() -> bool:
- """为 users 表添加 area_code 字段"""
- try:
- conn = await aiomysql.connect(
- host=settings.MYSQL_HOST,
- port=settings.MYSQL_PORT,
- user=settings.MYSQL_USER,
- password=settings.MYSQL_PASSWORD,
- db=settings.MYSQL_DATABASE,
- charset="utf8mb4",
- )
- async with conn.cursor() as cursor:
- # 检查 users 表是否存在
- await cursor.execute(
- """
- SELECT COUNT(*) FROM information_schema.tables
- WHERE table_schema = %s AND table_name = 'users'
- """,
- (settings.MYSQL_DATABASE,),
- )
- table_exists = (await cursor.fetchone())[0] > 0
- if not table_exists:
- print("❌ users 表不存在,请先创建表")
- conn.close()
- return False
- # 检查 area_code 列是否已存在
- await cursor.execute(
- """
- SELECT COUNT(*) FROM information_schema.columns
- WHERE table_schema = %s
- AND table_name = 'users'
- AND column_name = 'area_code'
- """,
- (settings.MYSQL_DATABASE,),
- )
- has_area_code = (await cursor.fetchone())[0] > 0
- if has_area_code:
- print("✅ area_code 字段已存在,无需迁移")
- conn.close()
- return True
- print("🔄 添加 area_code 字段...")
- await cursor.execute(
- """
- ALTER TABLE users
- ADD COLUMN area_code VARCHAR(10) NULL COMMENT '手机区号(如 +86)' AFTER user_type
- """
- )
- print("✅ area_code 字段添加成功")
- await conn.commit()
- print("✅ 迁移完成")
- conn.close()
- return True
- except Exception as e: # noqa: BLE001
- import traceback
- print(f"❌ 迁移失败: {e}")
- traceback.print_exc()
- return False
- if __name__ == "__main__":
- # 确认是否继续
- if len(sys.argv) > 1 and sys.argv[1] == "--force":
- confirm = "y"
- else:
- confirm = input("\n是否继续迁移 users 表添加 area_code 字段? (y/n): ")
- if confirm.lower() != "y":
- sys.exit(0)
- success = asyncio.run(migrate_add_area_code_column())
- if not success:
- sys.exit(1)
|