migrate_metadata_column.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. """
  2. 数据库迁移脚本:将 messages 表的 metadata 列重命名为 message_metadata
  3. 运行: python migrate_metadata_column.py
  4. """
  5. import asyncio
  6. import aiomysql
  7. from config import settings
  8. import sys
  9. async def migrate_metadata_column():
  10. """将 messages 表的 metadata 列重命名为 message_metadata"""
  11. try:
  12. # 创建数据库连接
  13. conn = 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. # 检查 messages 表是否存在
  23. await cursor.execute("""
  24. SELECT COUNT(*) FROM information_schema.tables
  25. WHERE table_schema = %s AND table_name = 'messages'
  26. """, (settings.MYSQL_DATABASE,))
  27. table_exists = (await cursor.fetchone())[0] > 0
  28. if not table_exists:
  29. print("❌ messages 表不存在,无需迁移")
  30. conn.close()
  31. return True
  32. # 检查是否存在 metadata 列
  33. await cursor.execute("""
  34. SELECT COUNT(*) FROM information_schema.columns
  35. WHERE table_schema = %s
  36. AND table_name = 'messages'
  37. AND column_name = 'metadata'
  38. """, (settings.MYSQL_DATABASE,))
  39. has_metadata = (await cursor.fetchone())[0] > 0
  40. # 检查是否已存在 message_metadata 列
  41. await cursor.execute("""
  42. SELECT COUNT(*) FROM information_schema.columns
  43. WHERE table_schema = %s
  44. AND table_name = 'messages'
  45. AND column_name = 'message_metadata'
  46. """, (settings.MYSQL_DATABASE,))
  47. has_message_metadata = (await cursor.fetchone())[0] > 0
  48. if has_message_metadata:
  49. print("✅ message_metadata 列已存在,无需迁移")
  50. conn.close()
  51. return True
  52. if not has_metadata:
  53. print("⚠️ metadata 列不存在,可能表结构已更新或表为空")
  54. conn.close()
  55. return True
  56. # 执行重命名操作
  57. print("🔄 开始迁移: metadata -> message_metadata")
  58. await cursor.execute("""
  59. ALTER TABLE messages
  60. CHANGE COLUMN metadata message_metadata JSON
  61. COMMENT '扩展信息(音频路径、识别耗时等)'
  62. """)
  63. await conn.commit()
  64. print("✅ 迁移成功: metadata 列已重命名为 message_metadata")
  65. conn.close()
  66. return True
  67. except Exception as e:
  68. import traceback
  69. print(f"❌ 迁移失败: {e}")
  70. traceback.print_exc()
  71. return False
  72. if __name__ == "__main__":
  73. # 确认是否继续
  74. if len(sys.argv) > 1 and sys.argv[1] == "--force":
  75. confirm = "y"
  76. else:
  77. confirm = input("\n是否继续迁移 messages 表的 metadata 列? (y/n): ")
  78. if confirm.lower() != 'y':
  79. sys.exit(0)
  80. # 执行迁移
  81. success = asyncio.run(migrate_metadata_column())
  82. if not success:
  83. sys.exit(1)