Refactor database sessions into FastAPI dependency
This commit is contained in:
@@ -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),
|
||||||
|
]
|
||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user