diff --git a/full-stack/3-fastapi/README.md b/full-stack/3-fastapi/README.md new file mode 100644 index 0000000..fdb7212 --- /dev/null +++ b/full-stack/3-fastapi/README.md @@ -0,0 +1,9 @@ +# FastAPI + SQLModel + +A simple and complete example of defining a REST API to insert and list users. +~~~ +fastapi dev users_api.py +~~~ + +Examples derived from the tutorial: +https://sqlmodel.tiangolo.com/tutorial/fastapi/simple-hero-api/ \ No newline at end of file diff --git a/full-stack/3-fastapi/users_api.py b/full-stack/3-fastapi/users_api.py new file mode 100644 index 0000000..6610cf7 --- /dev/null +++ b/full-stack/3-fastapi/users_api.py @@ -0,0 +1,38 @@ +from datetime import date +from fastapi import FastAPI +from sqlmodel import Field, Session, SQLModel, create_engine, select + +def parse_date(birthday_str: str | None) -> date | None: + if birthday_str: + return date.fromisoformat(birthday_str) + return None + +class Users(SQLModel, table=True): + email_id: str = Field(default=None, primary_key=True) + name: str + birthday: date | None = None + +POSTGRES_USER = "postgres" +POSTGRES_PASSWORD = "postgres" +POSTGRES_SERVER = "localhost" +POSTGRES_PORT = "5431" +POSTGRES_DB = "test" +POSTGRES_URL = f"postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_SERVER}:{POSTGRES_PORT}/{POSTGRES_DB}" + +engine = create_engine(POSTGRES_URL, echo=True) + +app = FastAPI() + +@app.post("/users/") +def create_user(user: Users): + with Session(engine) as session: + session.add(user) + session.commit() + session.refresh(user) + return user + +@app.get("/users/") +def read_users(): + with Session(engine) as session: + users = session.exec(select(Users)).all() + return users