Files
algorithm/backend/update_db.py
2026-02-08 20:06:35 +08:00

128 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
更新数据库结构删除api_keys表添加roles表修改users表
"""
from sqlalchemy.orm import Session
from sqlalchemy import text
from app.models.database import engine, Base, SessionLocal
from app.models.models import User, Role
from app.services.user import UserService
def update_db():
"""更新数据库结构"""
db = SessionLocal()
try:
# 1. 删除api_keys表
print("删除api_keys表...")
try:
db.execute(text("DROP TABLE IF EXISTS api_keys CASCADE"))
db.commit()
print("✅ api_keys表删除成功")
except Exception as e:
print(f"⚠️ 删除api_keys表时出错: {e}")
db.rollback()
# 2. 创建roles表
print("\n创建roles表...")
try:
# 直接执行SQL创建表避免依赖模型的顺序
db.execute(text("""
CREATE TABLE IF NOT EXISTS roles (
id VARCHAR PRIMARY KEY,
name VARCHAR UNIQUE NOT NULL,
description TEXT DEFAULT '',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
)
"""))
db.commit()
print("✅ roles表创建成功")
except Exception as e:
print(f"⚠️ 创建roles表时出错: {e}")
db.rollback()
# 3. 修改users表添加role_id字段删除role字段
print("\n修改users表...")
try:
# 检查是否存在role_id字段
result = db.execute(text("SELECT column_name FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'role_id'")).fetchone()
if not result:
# 添加role_id字段
db.execute(text("ALTER TABLE users ADD COLUMN role_id VARCHAR"))
print("✅ 添加role_id字段成功")
# 初始化默认角色
UserService.init_default_roles(db)
print("✅ 默认角色初始化成功")
# 获取默认角色
admin_role = UserService.get_role_by_name(db, "admin")
user_role = UserService.get_role_by_name(db, "user")
if admin_role and user_role:
# 更新现有用户的role_id字段
db.execute(text(f"UPDATE users SET role_id = CASE WHEN role = 'admin' THEN '{admin_role.id}' ELSE '{user_role.id}' END"))
print("✅ 更新用户role_id字段成功")
# 删除role字段
result = db.execute(text("SELECT column_name FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'role'")).fetchone()
if result:
db.execute(text("ALTER TABLE users DROP COLUMN role"))
print("✅ 删除role字段成功")
# 添加外键约束
db.execute(text("ALTER TABLE users ADD CONSTRAINT fk_users_role FOREIGN KEY (role_id) REFERENCES roles(id)"))
print("✅ 添加外键约束成功")
db.commit()
except Exception as e:
print(f"⚠️ 修改users表时出错: {e}")
db.rollback()
# 4. 检查并创建默认管理员账号
print("\n检查默认管理员账号...")
try:
# 检查是否已存在管理员账号
admin_user = db.query(User).filter(User.username == "admin").first()
if not admin_user:
# 获取默认管理员角色
admin_role = UserService.get_role_by_name(db, "admin")
if admin_role:
# 创建默认管理员账号
admin_user = User(
id="user-admin",
username="admin",
email="admin@example.com",
password_hash=UserService.get_password_hash("admin123"),
role_id=admin_role.id,
status="active"
)
db.add(admin_user)
db.commit()
db.refresh(admin_user)
print("✅ 默认管理员账号创建成功")
print(f"用户名: admin")
print(f"密码: admin123")
else:
print("❌ 无法创建管理员账号因为admin角色不存在")
else:
print("⚠️ 管理员账号已存在")
except Exception as e:
print(f"⚠️ 检查管理员账号时出错: {e}")
db.rollback()
print("\n✅ 数据库结构更新完成")
finally:
db.close()
if __name__ == "__main__":
update_db()