migrate_users.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #!/usr/bin/env python
  2. """
  3. 用户数据迁移脚本
  4. 将用户数据从JSON文件迁移到PostgreSQL数据库
  5. """
  6. import os
  7. import sys
  8. import json
  9. import logging
  10. import time
  11. import psycopg2
  12. # 添加项目根目录到Python路径
  13. sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
  14. from app.core.system.auth import init_db, get_pg_connection, release_pg_connection
  15. # 配置日志
  16. logging.basicConfig(
  17. level=logging.INFO,
  18. format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
  19. )
  20. logger = logging.getLogger(__name__)
  21. # 旧的用户数据文件路径
  22. OLD_USER_DATA_PATH = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'data', 'users.json')
  23. def migrate_users():
  24. """
  25. 将用户数据从JSON文件迁移到PostgreSQL数据库
  26. """
  27. logger.info("开始迁移用户数据...")
  28. # 确保用户表已创建
  29. init_db()
  30. # 检查旧的用户数据文件是否存在
  31. if not os.path.exists(OLD_USER_DATA_PATH):
  32. logger.warning(f"用户数据文件不存在: {OLD_USER_DATA_PATH},无需迁移")
  33. return
  34. conn = None
  35. try:
  36. # 读取旧的用户数据
  37. with open(OLD_USER_DATA_PATH, 'r', encoding='utf-8') as f:
  38. users = json.load(f)
  39. logger.info(f"从文件中读取了 {len(users)} 个用户")
  40. # 连接数据库
  41. conn = get_pg_connection()
  42. cursor = conn.cursor()
  43. migrated_count = 0
  44. skipped_count = 0
  45. for username, user_data in users.items():
  46. # 检查用户是否已存在
  47. check_query = "SELECT username FROM users WHERE username = %s"
  48. cursor.execute(check_query, (username,))
  49. if cursor.fetchone():
  50. logger.info(f"用户 {username} 已存在,跳过")
  51. skipped_count += 1
  52. continue
  53. # 创建用户
  54. insert_query = """
  55. INSERT INTO users (id, username, password, created_at, last_login, is_admin)
  56. VALUES (%s, %s, %s, %s, %s, %s)
  57. """
  58. cursor.execute(
  59. insert_query,
  60. (
  61. user_data.get('id', f"migrated-{time.time()}"),
  62. username,
  63. user_data.get('password', ''),
  64. user_data.get('created_at', time.time()),
  65. user_data.get('last_login'),
  66. user_data.get('is_admin', False)
  67. )
  68. )
  69. migrated_count += 1
  70. logger.info(f"已迁移用户: {username}")
  71. conn.commit()
  72. cursor.close()
  73. logger.info(f"迁移完成: 成功迁移 {migrated_count} 个用户,跳过 {skipped_count} 个用户")
  74. # 备份旧文件
  75. backup_path = f"{OLD_USER_DATA_PATH}.bak.{int(time.time())}"
  76. os.rename(OLD_USER_DATA_PATH, backup_path)
  77. logger.info(f"已备份旧用户数据文件到: {backup_path}")
  78. except Exception as e:
  79. logger.error(f"迁移用户数据失败: {str(e)}")
  80. if conn:
  81. conn.rollback()
  82. raise
  83. finally:
  84. if conn:
  85. release_pg_connection(conn)
  86. if __name__ == "__main__":
  87. try:
  88. migrate_users()
  89. except Exception as e:
  90. logger.error(f"迁移失败: {str(e)}")
  91. sys.exit(1)
  92. sys.exit(0)