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),
]
+18 -14
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,20 +32,20 @@ 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,
session: SessionDep,
):
try: try:
new_todo = Todo(task = todo_data.task) new_todo = Todo(task=todo_data.task)
session.add(new_todo) session.add(new_todo)
session.commit() session.commit()
session.refresh(new_todo)
return new_todo return new_todo
except SQLAlchemyError: except SQLAlchemyError:
session.rollback() session.rollback()
@@ -53,8 +53,11 @@ def todos_create(todo_data:todocreate):
@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,
update_data: todoupdate,
session: SessionDep,
):
try: try:
todo = session.get(Todo, todo_id) todo = session.get(Todo, todo_id)
if todo is None: if todo is None:
@@ -64,7 +67,6 @@ def todos_patch(todo_id:int, update_data:todoupdate):
if update_data.completion is not None: if update_data.completion is not None:
todo.completion = update_data.completion todo.completion = update_data.completion
session.commit() session.commit()
session.refresh(todo)
return todo return todo
except SQLAlchemyError: except SQLAlchemyError:
session.rollback() session.rollback()
@@ -72,8 +74,10 @@ def todos_patch(todo_id:int, update_data:todoupdate):
@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,
session: SessionDep,
):
try: try:
todo = session.get(Todo, todo_id) todo = session.get(Todo, todo_id)
if todo is None: if todo is None: