migrate_db.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. """
  2. 数据库迁移:为已有的 user 表添加 SSO 新增字段
  3. """
  4. import os
  5. from dotenv import load_dotenv
  6. load_dotenv(os.path.join(os.path.dirname(__file__), '.env'))
  7. from app import create_app, db
  8. def migrate():
  9. app = create_app()
  10. with app.app_context():
  11. conn = db.engine.connect()
  12. # 检查并添加 sso_sub
  13. result = conn.execute(
  14. db.text(
  15. "SELECT column_name FROM information_schema.columns "
  16. "WHERE table_name='user' AND column_name='sso_sub'"
  17. )
  18. )
  19. if not result.fetchone():
  20. conn.execute(db.text('ALTER TABLE "user" ADD COLUMN sso_sub VARCHAR(256)'))
  21. conn.execute(db.text('ALTER TABLE "user" ADD CONSTRAINT user_sso_sub_key UNIQUE (sso_sub)'))
  22. print("Added column sso_sub + unique constraint")
  23. else:
  24. print("sso_sub already exists")
  25. cols = [
  26. ("real_name", "VARCHAR(100)"),
  27. ("roles", "TEXT"),
  28. ("email", "VARCHAR(120)"),
  29. ("phone", "VARCHAR(30)"),
  30. ("avatar_url", "VARCHAR(500)"),
  31. ]
  32. for col, col_type in cols:
  33. result = conn.execute(
  34. db.text(
  35. f"SELECT column_name FROM information_schema.columns "
  36. f"WHERE table_name='user' AND column_name='{col}'"
  37. )
  38. )
  39. if not result.fetchone():
  40. conn.execute(db.text(f'ALTER TABLE "user" ADD COLUMN {col} {col_type}'))
  41. print(f"Added column {col}")
  42. else:
  43. print(f"{col} already exists")
  44. conn.commit()
  45. print("Migration complete.")
  46. if __name__ == "__main__":
  47. migrate()