import os from pathlib import Path from sqlalchemy import text from sqlmodel import SQLModel, Session, create_engine # 数据目录:优先使用环境变量(Docker 中设为 /app/data),否则用 backend/data/ DATA_DIR = Path(os.environ.get("NOVAL_DATA_DIR", Path(__file__).resolve().parent.parent / "data")) DATA_DIR.mkdir(exist_ok=True) DATABASE_URL = f"sqlite:///{DATA_DIR / 'noval.db'}" engine = create_engine(DATABASE_URL, echo=False) def init_db() -> None: SQLModel.metadata.create_all(engine) _migrate_outline_parent_id() def _migrate_outline_parent_id() -> None: """迁移:为 outline 表添加 parent_id 列(如果尚不存在)""" with Session(engine) as session: # 检查 outline 表是否存在 parent_id 列 result = session.exec(text("PRAGMA table_info(outline)")) columns = [row[1] for row in result] if "parent_id" not in columns: session.exec(text("ALTER TABLE outline ADD COLUMN parent_id INTEGER REFERENCES outline(id)")) session.exec(text("CREATE INDEX IF NOT EXISTS ix_outline_parent_id ON outline(parent_id)")) session.commit() def get_session(): with Session(engine) as session: yield session