from app import app from extensions import db from models import User, Role, Permission from sqlalchemy import text import sys def force_migrate(): with app.app_context(): print("🛠️ 开始强制迁移...") try: # 1. 尝试清除该表的其他活动连接 (仅限 PostgreSQL) print("🧹 正在清理数据库死锁...") db.session.execute(text(""" SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = current_database() AND pid <> pg_backend_pid(); """)) db.session.commit() except Exception as e: print(f"⚠️ 清理连接跳过 (可能是权限问题): {e}") try: # 2. 创建所有新表 print("📦 正在同步表结构...") db.create_all() # 3. 增加字段 print("📝 正在调整 users 表结构...") db.session.execute(text('ALTER TABLE users ADD COLUMN IF NOT EXISTS role_id INTEGER REFERENCES roles(id)')) db.session.commit() # 4. 初始化角色和权限 print("🚀 正在初始化 RBAC 权限数据...") perms = { 'view_logs': '查看系统日志', 'manage_rbac': '管理角色与权限', 'manage_users': '管理用户信息', 'manage_system': '系统最高权限' } perm_objs = {} for code, desc in perms.items(): p = Permission.query.filter_by(name=code).first() if not p: p = Permission(name=code, description=desc) db.session.add(p) db.session.flush() perm_objs[code] = p # 创建管理员角色 admin_role = Role.query.filter_by(name='超级管理员').first() if not admin_role: admin_role = Role(name='超级管理员', description='系统最高权限持有者') admin_role.permissions = list(perm_objs.values()) db.session.add(admin_role) # 创建用户角色 user_role = Role.query.filter_by(name='普通用户').first() if not user_role: user_role = Role(name='普通用户', description='常规功能使用者') db.session.add(user_role) db.session.flush() # 5. 修复旧数据:把所有现有用户设为超级管理员(方便你第一时间进入后台) print("👤 正在升级现有用户为管理员...") all_users = User.query.all() for u in all_users: u.role = admin_role db.session.commit() print("✨ 迁移与初始化全部完成!") except Exception as e: print(f"❌ 运行出错: {e}") db.session.rollback() raise e if __name__ == '__main__': force_migrate()