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
+51 -47
View File
@@ -2,11 +2,11 @@ from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from sqlalchemy import select
from sqlalchemy.orm import Session
from database import engine
from models import Todo
from sqlalchemy.exc import SQLAlchemyError
from dependencies import SessionDep
from models import Todo
app = FastAPI()
app.add_middleware(
CORSMiddleware,
@@ -32,55 +32,59 @@ def health():
return {"status":"ok"}
@app.get("/todos", response_model=list[todoresponse])
def todos_get():
with Session(engine) as session:
statement = select(Todo)
todos = session.scalars(statement).all()
return todos
def todos_get(session: SessionDep):
statement = select(Todo)
todos = session.scalars(statement).all()
return todos
@app.post("/todos", response_model=todoresponse)
def todos_create(todo_data:todocreate):
with Session(engine) as session:
try:
new_todo = Todo(task = todo_data.task)
session.add(new_todo)
session.commit()
session.refresh(new_todo)
return new_todo
except SQLAlchemyError:
session.rollback()
raise
def todos_create(
todo_data: todocreate,
session: SessionDep,
):
try:
new_todo = Todo(task=todo_data.task)
session.add(new_todo)
session.commit()
return new_todo
except SQLAlchemyError:
session.rollback()
raise
@app.patch("/todos/{todo_id}", response_model=todoresponse)
def todos_patch(todo_id:int, update_data:todoupdate):
with Session(engine) as session:
try:
todo = session.get(Todo, todo_id)
if todo is None:
raise HTTPException(status_code = 404, detail = "Todo not found")
if update_data.task is not None:
todo.task = update_data.task
if update_data.completion is not None:
todo.completion = update_data.completion
session.commit()
session.refresh(todo)
return todo
except SQLAlchemyError:
session.rollback()
raise
def todos_patch(
todo_id: int,
update_data: todoupdate,
session: SessionDep,
):
try:
todo = session.get(Todo, todo_id)
if todo is None:
raise HTTPException(status_code = 404, detail = "Todo not found")
if update_data.task is not None:
todo.task = update_data.task
if update_data.completion is not None:
todo.completion = update_data.completion
session.commit()
return todo
except SQLAlchemyError:
session.rollback()
raise
@app.delete("/todos/{todo_id}", response_model=todoresponse)
def todos_delete(todo_id:int):
with Session(engine) as session:
try:
todo = session.get(Todo, todo_id)
if todo is None:
raise HTTPException(status_code = 404, detail = "Todo not found")
session.delete(todo)
session.commit()
return todo
except SQLAlchemyError:
session.rollback()
raise
def todos_delete(
todo_id: int,
session: SessionDep,
):
try:
todo = session.get(Todo, todo_id)
if todo is None:
raise HTTPException(status_code = 404, detail = "Todo not found")
session.delete(todo)
session.commit()
return todo
except SQLAlchemyError:
session.rollback()
raise