diff --git a/.gitignore b/.gitignore index cc0f159..cdea58f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .venv /.idea/ -/database.db +/api/database.db diff --git a/api/.env b/api/.env new file mode 100644 index 0000000..f631b6c --- /dev/null +++ b/api/.env @@ -0,0 +1,2 @@ +SQLITE_FILE_NAME=database2.db +DATABASE_URL=sqlite:///database2.db \ No newline at end of file diff --git a/api/main.py b/api/main.py index a3db2db..39ad509 100644 --- a/api/main.py +++ b/api/main.py @@ -1,28 +1,35 @@ import datetime from fastapi import FastAPI +from sqlalchemy.exc import IntegrityError from sqlmodel import Session, SQLModel, create_engine, select from contextlib import asynccontextmanager - from api.models import Car, FuelItem +from pydantic_settings import BaseSettings, SettingsConfigDict -sqlite_file_name = "database.db" -sqlite_url = f"sqlite:///{sqlite_file_name}" + +class Settings(BaseSettings): + database_url: str = "" + sqlite_file_name: str = "" + + model_config = SettingsConfigDict(env_file=".env") + + +settings = Settings() + +database_url = settings.database_url connect_args = { "check_same_thread": False } -engine = create_engine(sqlite_url, echo=True, connect_args=connect_args) +engine = create_engine(database_url, echo=True, connect_args=connect_args) def create_db_and_tables(): SQLModel.metadata.create_all(engine) -@asynccontextmanager -async def lifespan(app: FastAPI): - # startup - create_db_and_tables() +def fill_database(): car = Car(id_string="Auto 1") with Session(engine) as session: session.add(car) @@ -37,6 +44,16 @@ async def lifespan(app: FastAPI): session.add(fill_item) session.commit() session.refresh(fill_item) + + +@asynccontextmanager +async def lifespan(app: FastAPI): + # startup + create_db_and_tables() + try: + fill_database() + except IntegrityError as e: + print(e) yield diff --git a/api/models.py b/api/models.py index ec7a845..d790d40 100644 --- a/api/models.py +++ b/api/models.py @@ -5,12 +5,12 @@ from sqlmodel import Field, SQLModel class Car(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) - id_string: str = Field(nullable=False, index=True) + id_string: str = Field(nullable=False, index=True, unique=True) 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) + car_id: int | None = Field(default=None, foreign_key="car.id", unique_items=True) + date: datetime.date = Field(nullable=False, index=True, unique_items=True) odometer_reading: float = Field(nullable=False) fuel_fill: float = Field(nullable=False) diff --git a/requirements.txt b/api/requirements.txt similarity index 83% rename from requirements.txt rename to api/requirements.txt index bfd1b84..167566b 100644 --- a/requirements.txt +++ b/api/requirements.txt @@ -7,7 +7,8 @@ uvicorn==0.38.0 idna==3.11 pydantic==2.12.* pydantic_core==2.41.* +pydantic_settings==2.11.* sniffio==1.3.* -starlette==0.48.* +starlette==0.49.* typing-inspection==0.4.* typing_extensions==4.15.*