| 12345678910111213141516171819202122232425262728293031323334 |
- """数据库引擎、会话与建表"""
- from sqlalchemy import create_engine
- from sqlalchemy.orm import declarative_base, sessionmaker
- from sqlalchemy.pool import StaticPool
- from app.core.config import get_settings
- settings = get_settings()
- _engine_kwargs = {}
- if settings.DATABASE_URL.startswith("sqlite"):
- _engine_kwargs["connect_args"] = {"check_same_thread": False}
- # :memory: 需 StaticPool,否则不同连接看不到同一库
- if ":memory:" in settings.DATABASE_URL:
- _engine_kwargs["poolclass"] = StaticPool
- engine = create_engine(settings.DATABASE_URL, **_engine_kwargs)
- SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
- Base = declarative_base()
- def get_db():
- db = SessionLocal()
- try:
- yield db
- finally:
- db.close()
- def init_db() -> None:
- # Import models so metadata is registered before create_all
- import app.models # noqa: F401
- Base.metadata.create_all(bind=engine)
|