database.py 972 B

12345678910111213141516171819202122232425262728293031323334
  1. """数据库引擎、会话与建表"""
  2. from sqlalchemy import create_engine
  3. from sqlalchemy.orm import declarative_base, sessionmaker
  4. from sqlalchemy.pool import StaticPool
  5. from app.core.config import get_settings
  6. settings = get_settings()
  7. _engine_kwargs = {}
  8. if settings.DATABASE_URL.startswith("sqlite"):
  9. _engine_kwargs["connect_args"] = {"check_same_thread": False}
  10. # :memory: 需 StaticPool,否则不同连接看不到同一库
  11. if ":memory:" in settings.DATABASE_URL:
  12. _engine_kwargs["poolclass"] = StaticPool
  13. engine = create_engine(settings.DATABASE_URL, **_engine_kwargs)
  14. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  15. Base = declarative_base()
  16. def get_db():
  17. db = SessionLocal()
  18. try:
  19. yield db
  20. finally:
  21. db.close()
  22. def init_db() -> None:
  23. # Import models so metadata is registered before create_all
  24. import app.models # noqa: F401
  25. Base.metadata.create_all(bind=engine)