add_data_source_column.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """
  2. 迁移脚本:为 family_member_info 表添加 data_source 字段
  3. - 新增 data_source VARCHAR(20) NOT NULL DEFAULT 'backend'
  4. - 将所有现有记录赋值为 'backend'
  5. - 取值约定:'backend' | 'miniprogram' | 'pdf_ai'
  6. """
  7. import pymysql
  8. DB_CONFIG = {
  9. "host": "rm-f8ze60yirdj8786u2wo.mysql.rds.aliyuncs.com",
  10. "port": 3306,
  11. "user": "root",
  12. "password": "csqz@20255",
  13. "db": "csqz-client",
  14. "charset": "utf8mb4",
  15. "cursorclass": pymysql.cursors.DictCursor
  16. }
  17. def run():
  18. conn = pymysql.connect(**DB_CONFIG)
  19. try:
  20. with conn.cursor() as cursor:
  21. # 1. 检查字段是否已存在
  22. cursor.execute("SHOW COLUMNS FROM family_member_info LIKE 'data_source'")
  23. exists = cursor.fetchone()
  24. if exists:
  25. print("[Migration] data_source 字段已存在,跳过 ALTER TABLE")
  26. else:
  27. print("[Migration] 添加 data_source 字段...")
  28. cursor.execute("""
  29. ALTER TABLE family_member_info
  30. ADD COLUMN data_source VARCHAR(20) NOT NULL DEFAULT 'backend'
  31. COMMENT '录入来源: backend=后台手工, miniprogram=小程序, pdf_ai=PDF智能识别'
  32. """)
  33. conn.commit()
  34. print("[Migration] 字段添加成功")
  35. # 2. 将所有现有记录显式赋值为 'backend'(DEFAULT 已覆盖,这里做二次保障)
  36. cursor.execute("SELECT COUNT(*) as total FROM family_member_info WHERE data_source != 'backend' OR data_source IS NULL")
  37. row = cursor.fetchone()
  38. not_backend = row['total']
  39. if not_backend > 0:
  40. print(f"[Migration] 发现 {not_backend} 条记录需要更新为 'backend'...")
  41. cursor.execute("UPDATE family_member_info SET data_source = 'backend' WHERE data_source != 'backend' OR data_source IS NULL")
  42. conn.commit()
  43. print(f"[Migration] 已将 {cursor.rowcount} 条记录更新为 'backend'")
  44. else:
  45. print("[Migration] 所有现有记录已为 'backend',无需更新")
  46. # 3. 验证结果
  47. cursor.execute("SELECT data_source, COUNT(*) as cnt FROM family_member_info GROUP BY data_source")
  48. stats = cursor.fetchall()
  49. print("\n[Migration] 当前 data_source 分布:")
  50. for row in stats:
  51. print(f" {row['data_source']}: {row['cnt']} 条")
  52. print("\n[Migration] 迁移完成 ✓")
  53. except Exception as e:
  54. conn.rollback()
  55. print(f"[Migration] 错误: {e}")
  56. raise
  57. finally:
  58. conn.close()
  59. if __name__ == '__main__':
  60. run()