cenra-api / app /database.py
jeremy0915's picture
部署後端 FastAPI + SQLite (Docker)
f6f21d4 verified
Raw
History Blame Contribute Delete
1.28 kB
"""資料庫連線與初始化(SQLite via SQLModel)。
- engine:從 .env 的 DATABASE_URL 建立連線。
- init_db():建表,若資料表是空的,把 40 筆假資料寫入(首次啟動用)。
- get_session():FastAPI 依賴注入用的 session。
"""
from sqlmodel import Session, SQLModel, create_engine, select
from app.config import settings
from app.fake_data import get_raw_customers
from app.models import Customer
# SQLite 需要 check_same_thread=False 才能在 FastAPI 多執行緒下使用
connect_args = {"check_same_thread": False} if settings.database_url.startswith("sqlite") else {}
engine = create_engine(settings.database_url, echo=False, connect_args=connect_args)
def init_db() -> None:
"""建表 + 首次填入種子資料。"""
SQLModel.metadata.create_all(engine)
with Session(engine) as session:
existing = session.exec(select(Customer)).first()
if existing is None:
for raw in get_raw_customers():
# 去掉 fake_data 自帶的 id,讓資料庫自動編號
raw = {k: v for k, v in raw.items() if k != "id"}
session.add(Customer(**raw))
session.commit()
def get_session():
with Session(engine) as session:
yield session