# app/database.py from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, Session from sqlalchemy.ext.declarative import declarative_base from contextlib import contextmanager from typing import Generator import os from .config import settings # 创建数据库引擎 engine = create_engine( settings.DATABASE_URL, connect_args={"check_same_thread": False} if "sqlite" in settings.DATABASE_URL else {}, echo=settings.DEBUG ) # 创建会话工厂 SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) # 声明基类 Base = declarative_base() def get_db() -> Generator[Session, None, None]: """数据库会话依赖注入""" db = SessionLocal() try: yield db finally: db.close() def init_db(): """初始化数据库表""" from .models.user import User Base.metadata.create_all(bind=engine) print("✅ 数据库表创建完成") # 创建默认管理员用户 db = SessionLocal() try: # 检查是否已存在管理员 admin = db.query(User).filter(User.username == "admin").first() if not admin: from .core.security import password_hasher admin_user = User( username="admin", email="admin@caiyouhui.com", hashed_password=password_hasher.hash_password("Admin123!"), full_name="系统管理员", is_active=True, is_verified=True, is_superuser=True ) db.add(admin_user) db.commit() print("✅ 默认管理员用户已创建") except Exception as e: print(f"⚠️ 创建管理员用户时出错: {e}") db.rollback() finally: db.close() # 导出 __all__ = ["Base", "engine", "SessionLocal", "get_db", "init_db"]