- proxy_service.py: 将requests和WhitelistManager改为函数内延迟import, 避免启动时加载不需要的依赖;移除未使用的get_exit_ip_via_proxy导入 - account_service.py: 移除未使用的func、joinedload、AuditLog、 user_has_permission顶层导入
73 lines
2.0 KiB
Python
73 lines
2.0 KiB
Python
"""数据库引擎与会话管理"""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker, declarative_base
|
|
|
|
PROJECT_ROOT = Path(__file__).resolve().parents[2]
|
|
DB_PATH = PROJECT_ROOT / "data" / "web.db"
|
|
DB_PATH.parent.mkdir(parents=True, exist_ok=True)
|
|
DATABASE_URL = os.getenv("DATABASE_URL", f"sqlite:///{DB_PATH}")
|
|
|
|
connect_args = {"check_same_thread": False} if DATABASE_URL.startswith("sqlite") else {}
|
|
|
|
engine = create_engine(
|
|
DATABASE_URL,
|
|
connect_args=connect_args,
|
|
echo=False,
|
|
)
|
|
|
|
SessionLocal = sessionmaker(bind=engine, autocommit=False, autoflush=False)
|
|
Base = declarative_base()
|
|
|
|
|
|
def get_db():
|
|
"""FastAPI 依赖:提供数据库会话,请求结束自动关闭。"""
|
|
db = SessionLocal()
|
|
try:
|
|
yield db
|
|
finally:
|
|
db.close()
|
|
|
|
|
|
def init_db():
|
|
"""执行数据库迁移 + 写入初始数据。"""
|
|
run_migrations()
|
|
_seed()
|
|
|
|
|
|
def run_migrations():
|
|
"""运行 Alembic 迁移到最新版本。"""
|
|
from alembic import command
|
|
from alembic.config import Config
|
|
|
|
config = Config(str(PROJECT_ROOT / "alembic.ini"))
|
|
config.set_main_option("script_location", str(PROJECT_ROOT / "web" / "backend" / "migrations"))
|
|
config.set_main_option("sqlalchemy.url", DATABASE_URL)
|
|
command.upgrade(config, "head")
|
|
|
|
|
|
def _seed():
|
|
"""写入默认超管账号和角色(账号密码通过环境变量配置)。"""
|
|
from .models import User
|
|
from .security import hash_password
|
|
|
|
admin_username = os.getenv("ADMIN_USERNAME", "admin")
|
|
admin_password = os.getenv("ADMIN_PASSWORD", "admin123")
|
|
|
|
db = SessionLocal()
|
|
try:
|
|
if not db.query(User).first():
|
|
admin = User(
|
|
username=admin_username,
|
|
password_hash=hash_password(admin_password),
|
|
role="super_admin",
|
|
is_active=True,
|
|
remark="默认超级管理员",
|
|
)
|
|
db.add(admin)
|
|
db.commit()
|
|
finally:
|
|
db.close()
|