- config.py: DATABASE_URL 默认值改为 SQLite - database.py: 移除 PostgreSQL 分支,简化为纯 SQLite - models/base.py: 移除 pgvector 导入和条件分支 - search_service.py: 移除 _search_postgres 方法 - import_service.py: 移除 pgvector 相关代码 - requirements.txt: 移除 asyncpg/alembic/pgvector 依赖 - pyproject.toml: 同步移除相关依赖 - docker-compose.yml: 移除 db 服务,- 删除 alembic.ini/Dockerfile.db/sql 目录 - README.md: 更新文档,移除 PostgreSQL 相关内容 适合 NAS 等资源受限环境的轻量级部署
73 lines
2.1 KiB
Python
73 lines
2.1 KiB
Python
"""
|
|
数据库连接管理
|
|
|
|
SQLite 数据库,支持异步操作。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from typing import AsyncGenerator
|
|
|
|
from sqlalchemy import text
|
|
from sqlalchemy.ext.asyncio import (
|
|
AsyncSession,
|
|
async_sessionmaker,
|
|
create_async_engine,
|
|
)
|
|
|
|
from app.config import settings
|
|
|
|
# ──────────────────────────── 数据库引擎 ────────────────────────────
|
|
|
|
DB_URL = settings.DATABASE_URL
|
|
|
|
# 解析 SQLite 文件路径
|
|
sqlite_path = DB_URL.replace("sqlite+aiosqlite:///", "")
|
|
if not sqlite_path.startswith("/"):
|
|
sqlite_path = str(Path(__file__).parent.parent / sqlite_path)
|
|
|
|
# 确保数据目录存在
|
|
Path(sqlite_path).parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
engine = create_async_engine(
|
|
f"sqlite+aiosqlite:///{sqlite_path}",
|
|
echo=False,
|
|
)
|
|
|
|
# ──────────────────────────── 会话工厂 ────────────────────────────
|
|
|
|
async_session_factory = async_sessionmaker(
|
|
bind=engine,
|
|
class_=AsyncSession,
|
|
expire_on_commit=False,
|
|
autoflush=False,
|
|
)
|
|
|
|
|
|
# ──────────────────────────── 依赖注入 ────────────────────────────
|
|
|
|
async def get_db() -> AsyncGenerator[AsyncSession, None]:
|
|
"""
|
|
FastAPI 依赖项:获取异步数据库会话。
|
|
"""
|
|
async with async_session_factory() as session:
|
|
yield session
|
|
|
|
|
|
async def close_db() -> None:
|
|
"""关闭数据库连接池"""
|
|
await engine.dispose()
|
|
|
|
|
|
async def init_db() -> None:
|
|
"""初始化数据库:建表"""
|
|
from app.models.base import Base
|
|
|
|
async with engine.begin() as conn:
|
|
# SQLite 启用 WAL 模式和外键约束
|
|
await conn.execute(text("PRAGMA journal_mode=WAL"))
|
|
await conn.execute(text("PRAGMA foreign_keys=ON"))
|
|
# 创建所有表
|
|
await conn.run_sync(Base.metadata.create_all)
|