#!/usr/bin/env python3 """ 初始化管理员账号。从项目根目录的 .env 读取 ADMIN_USERNAME、ADMIN_PASSWORD(可选), 未设置则使用默认 admin / admin。需先执行 Alembic 迁移。 用法(在项目根目录): python deploy/scripts/seed.py 或:cd backend && PYTHONPATH=. python ../deploy/scripts/seed.py """ import os import sys import uuid # 允许从项目根或 backend 运行 sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "backend")) from dotenv import load_dotenv load_dotenv(os.path.join(os.path.dirname(__file__), "..", "..", ".env")) from sqlalchemy import create_engine, select, text from sqlalchemy.orm import sessionmaker # 同步连接,供脚本使用 DATABASE_URL_SYNC = os.getenv( "DATABASE_URL_SYNC", "postgresql://wecom:wecom_secret@localhost:5432/wecom_ai", ) def main(): import bcrypt username = os.getenv("ADMIN_USERNAME", "admin") password = os.getenv("ADMIN_PASSWORD", "admin") password_hash = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()).decode("utf-8") engine = create_engine(DATABASE_URL_SYNC) Session = sessionmaker(bind=engine) with Session() as session: # 检查 users 表是否存在 try: session.execute(text("SELECT 1 FROM users LIMIT 1")) except Exception: print("表 users 不存在,请先执行: cd backend && alembic upgrade head") sys.exit(1) # 是否已存在该用户名 r = session.execute( text("SELECT id FROM users WHERE username = :u"), {"u": username}, ) if r.one_or_none(): print(f"用户 {username} 已存在,跳过创建。") return user_id = uuid.uuid4() session.execute( text( "INSERT INTO users (id, username, password_hash, role, is_active, created_at) " "VALUES (:id, :u, :p, 'admin', true, NOW())" ), {"id": user_id, "u": username, "p": password_hash}, ) session.commit() print(f"已创建管理员: username={username}") if __name__ == "__main__": main()