diff --git a/.gitignore b/.gitignore index 807849c..cc0f159 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .venv /.idea/ +/database.db diff --git a/api/main.py b/api/main.py index 3d4a147..a3db2db 100644 --- a/api/main.py +++ b/api/main.py @@ -1,20 +1,75 @@ import datetime from fastapi import FastAPI +from sqlmodel import Session, SQLModel, create_engine, select +from contextlib import asynccontextmanager from api.models import Car, FuelItem -app = FastAPI() +sqlite_file_name = "database.db" +sqlite_url = f"sqlite:///{sqlite_file_name}" + +connect_args = { + "check_same_thread": False + } +engine = create_engine(sqlite_url, echo=True, connect_args=connect_args) -car = Car(id_string="Auto 1") -fill_item = FuelItem( - car=car, - date=datetime.date.today(), - odometer_reading=101005, - fuel_fill=52.26 - ) +def create_db_and_tables(): + SQLModel.metadata.create_all(engine) -@app.get("/") -async def root(): - return fill_item \ No newline at end of file + +@asynccontextmanager +async def lifespan(app: FastAPI): + # startup + create_db_and_tables() + car = Car(id_string="Auto 1") + with Session(engine) as session: + session.add(car) + session.commit() + session.refresh(car) + fill_item = FuelItem( + car_id=car.id, + date=datetime.date.today(), + odometer_reading=101005, + fuel_fill=52.26 + ) + session.add(fill_item) + session.commit() + session.refresh(fill_item) + yield + + +app = FastAPI(lifespan=lifespan) + + +@app.post("/cars/") +def create_cars(car: Car): + with Session(engine) as session: + session.add(car) + session.commit() + session.refresh(car) + return car + + +@app.get("/cars/") +def read_cars(): + with Session(engine) as session: + cars = session.exec(select(Car)).all() + return cars + + +@app.post("/fill_items/") +def create_cars(fill_item: FuelItem): + with Session(engine) as session: + session.add(fill_item) + session.commit() + session.refresh(fill_item) + return fill_item + + +@app.get("/fill_items/") +def read_cars(): + with Session(engine) as session: + fill_items = session.exec(select(FuelItem)).all() + return fill_items diff --git a/api/models.py b/api/models.py index fb7e6a8..ec7a845 100644 --- a/api/models.py +++ b/api/models.py @@ -1,14 +1,16 @@ import datetime -from pydantic import BaseModel, EmailStr +from sqlmodel import Field, SQLModel -class Car(BaseModel): - id_string: str +class Car(SQLModel, table=True): + id: int | None = Field(default=None, primary_key=True) + id_string: str = Field(nullable=False, index=True) -class FuelItem(BaseModel): - car: Car - date: datetime.date - odometer_reading: float - fuel_fill: float \ No newline at end of file +class FuelItem(SQLModel, table=True): + id: int | None = Field(default=None, primary_key=True) + car_id: int | None = Field(default=None, foreign_key="car.id") + date: datetime.date = Field(nullable=False, index=True) + odometer_reading: float = Field(nullable=False) + fuel_fill: float = Field(nullable=False) diff --git a/requirements.txt b/requirements.txt index 2084b60..bfd1b84 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ annotated-doc==0.0.* annotated-types==0.7.* anyio==4.11.* fastapi==0.120.* +sqlmodel==0.0.* uvicorn==0.38.0 idna==3.11 pydantic==2.12.*