Refactor database sessions into FastAPI dependency

This commit is contained in:
2026-07-22 13:22:32 +08:00
parent b50625c606
commit 5159e1a2b1
2 changed files with 68 additions and 47 deletions
+17
View File
@@ -0,0 +1,17 @@
from typing import Annotated
from fastapi import Depends
from sqlalchemy.orm import Session
from database import engine
def get_session():
with Session(engine, expire_on_commit=False) as session:
yield session
SessionDep = Annotated[
Session,
Depends(get_session),
]
+51 -47
View File
@@ -2,11 +2,11 @@ from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel from pydantic import BaseModel
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.orm import Session
from database import engine
from models import Todo
from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.exc import SQLAlchemyError
from dependencies import SessionDep
from models import Todo
app = FastAPI() app = FastAPI()
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
@@ -32,55 +32,59 @@ def health():
return {"status":"ok"} return {"status":"ok"}
@app.get("/todos", response_model=list[todoresponse]) @app.get("/todos", response_model=list[todoresponse])
def todos_get(): def todos_get(session: SessionDep):
with Session(engine) as session: statement = select(Todo)
statement = select(Todo) todos = session.scalars(statement).all()
todos = session.scalars(statement).all() return todos
return todos
@app.post("/todos", response_model=todoresponse) @app.post("/todos", response_model=todoresponse)
def todos_create(todo_data:todocreate): def todos_create(
with Session(engine) as session: todo_data: todocreate,
try: session: SessionDep,
new_todo = Todo(task = todo_data.task) ):
session.add(new_todo) try:
session.commit() new_todo = Todo(task=todo_data.task)
session.refresh(new_todo) session.add(new_todo)
return new_todo session.commit()
except SQLAlchemyError: return new_todo
session.rollback() except SQLAlchemyError:
raise session.rollback()
raise
@app.patch("/todos/{todo_id}", response_model=todoresponse) @app.patch("/todos/{todo_id}", response_model=todoresponse)
def todos_patch(todo_id:int, update_data:todoupdate): def todos_patch(
with Session(engine) as session: todo_id: int,
try: update_data: todoupdate,
todo = session.get(Todo, todo_id) session: SessionDep,
if todo is None: ):
raise HTTPException(status_code = 404, detail = "Todo not found") try:
if update_data.task is not None: todo = session.get(Todo, todo_id)
todo.task = update_data.task if todo is None:
if update_data.completion is not None: raise HTTPException(status_code = 404, detail = "Todo not found")
todo.completion = update_data.completion if update_data.task is not None:
session.commit() todo.task = update_data.task
session.refresh(todo) if update_data.completion is not None:
return todo todo.completion = update_data.completion
except SQLAlchemyError: session.commit()
session.rollback() return todo
raise except SQLAlchemyError:
session.rollback()
raise
@app.delete("/todos/{todo_id}", response_model=todoresponse) @app.delete("/todos/{todo_id}", response_model=todoresponse)
def todos_delete(todo_id:int): def todos_delete(
with Session(engine) as session: todo_id: int,
try: session: SessionDep,
todo = session.get(Todo, todo_id) ):
if todo is None: try:
raise HTTPException(status_code = 404, detail = "Todo not found") todo = session.get(Todo, todo_id)
session.delete(todo) if todo is None:
session.commit() raise HTTPException(status_code = 404, detail = "Todo not found")
return todo session.delete(todo)
except SQLAlchemyError: session.commit()
session.rollback() return todo
raise except SQLAlchemyError:
session.rollback()
raise