diff --git a/endpoints/book.post.py b/endpoints/book.post.py new file mode 100644 index 0000000..594d6c4 --- /dev/null +++ b/endpoints/book.post.py @@ -0,0 +1,90 @@ +Sure, here's an example of a FastAPI endpoint that saves data to a database using SQLAlchemy and Pydantic: + +```python +from typing import List +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel +from sqlalchemy import Column, Integer, String, create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy.ext.declarative import declarative_base + +# Create the database engine and session +engine = create_engine('sqlite:///books.db', echo=True) +Session = sessionmaker(bind=engine) +session = Session() + +# Create the base class for SQLAlchemy models +Base = declarative_base() + +# Define the SQLAlchemy model +class Book(Base): + __tablename__ = 'books' + + id = Column(Integer, primary_key=True) + title = Column(String) + author = Column(String) + + def __repr__(self): + return f"Book(id={self.id}, title='{self.title}', author='{self.author}')" + +# Create the database table +Base.metadata.create_all(engine) + +# Define the Pydantic model +class BookSchema(BaseModel): + title: str + author: str + + class Config: + orm_mode = True + +# Create the FastAPI app +app = FastAPI() + +# Define the POST endpoint +@app.post('/books', response_model=List[BookSchema]) +def create_book(book: BookSchema): + # Create a new book instance + new_book = Book(title=book.title, author=book.author) + + # Add the new book to the session + session.add(new_book) + + # Commit the changes to the database + session.commit() + + # Retrieve all books from the database + books = session.query(Book).all() + + # Convert the SQLAlchemy models to Pydantic models + return [BookSchema.from_orm(book) for book in books] + +# Run the app +if __name__ == '__main__': + import uvicorn + uvicorn.run(app, host='0.0.0.0', port=8000) +``` + +Here's a breakdown of the code: + +1. We define the SQLAlchemy model `Book` with `id`, `title`, and `author` columns. +2. We create the database table using `Base.metadata.create_all(engine)`. +3. We define the Pydantic model `BookSchema` with `title` and `author` fields. +4. We create the FastAPI app instance. +5. We define the `POST` endpoint `/books` that accepts a `BookSchema` instance as input. +6. Inside the endpoint function, we create a new `Book` instance using the data from the `BookSchema` instance. +7. We add the new `Book` instance to the session and commit the changes to the database. +8. We retrieve all books from the database using `session.query(Book).all()`. +9. We convert the SQLAlchemy models to Pydantic models using `BookSchema.from_orm(book)`. +10. We return the list of `BookSchema` instances as the response. + +To run the app, execute `uvicorn main:app --reload` in your terminal, and then you can send a POST request to `http://localhost:8000/books` with a JSON payload like: + +```json +{ + "title": "The Great Gatsby", + "author": "F. Scott Fitzgerald" +} +``` + +This will create a new book in the database and return a list of all books in the database. \ No newline at end of file