migrate_add_feedbacks_table.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. """
  2. 数据库迁移脚本:创建反馈表
  3. 运行: python migrate_add_feedbacks_table.py
  4. """
  5. import asyncio
  6. import sys
  7. from typing import Any
  8. import aiomysql
  9. from config import settings
  10. async def migrate_create_feedbacks_table() -> bool:
  11. """创建反馈表"""
  12. try:
  13. conn: aiomysql.Connection = 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. # 检查表是否存在
  23. await cursor.execute(
  24. """
  25. SELECT COUNT(*) FROM information_schema.tables
  26. WHERE table_schema = %s AND table_name = 'feedbacks'
  27. """,
  28. (settings.MYSQL_DATABASE,),
  29. )
  30. exists_row: Any = await cursor.fetchone()
  31. table_exists = bool(exists_row and exists_row[0] > 0)
  32. if not table_exists:
  33. print("🔄 创建 feedbacks 表...")
  34. await cursor.execute(
  35. """
  36. CREATE TABLE feedbacks (
  37. id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
  38. feedback_id VARCHAR(64) NOT NULL UNIQUE COMMENT '反馈ID',
  39. user_id VARCHAR(64) NOT NULL COMMENT '用户ID',
  40. -- 反馈内容
  41. content TEXT NOT NULL COMMENT '反馈内容',
  42. -- 状态信息
  43. status ENUM('pending', 'reviewed', 'resolved', 'closed') NOT NULL DEFAULT 'pending' COMMENT '反馈状态',
  44. -- 扩展信息
  45. metadata JSON NULL COMMENT '扩展信息',
  46. -- 时间信息
  47. created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  48. updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  49. INDEX idx_feedback_id (feedback_id),
  50. INDEX idx_user_id (user_id),
  51. INDEX idx_feedback_user_created (user_id, created_at)
  52. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  53. COMMENT='用户反馈表'
  54. """
  55. )
  56. await conn.commit()
  57. print("✅ feedbacks 表创建完成")
  58. else:
  59. print("✅ feedbacks 表已存在")
  60. conn.close()
  61. return True
  62. except Exception:
  63. import traceback
  64. traceback.print_exc()
  65. return False
  66. if __name__ == "__main__":
  67. if len(sys.argv) > 1 and sys.argv[1] == "--force":
  68. confirm = "y"
  69. else:
  70. confirm = input("\n是否继续执行迁移? (y/n): ")
  71. if confirm.lower() != "y":
  72. sys.exit(0)
  73. ok = asyncio.run(migrate_create_feedbacks_table())
  74. if not ok:
  75. sys.exit(1)