Update code in endpoints/book.post.py
This commit is contained in:
parent
d37777d2e3
commit
bb0c35c7d2
90
endpoints/book.post.py
Normal file
90
endpoints/book.post.py
Normal file
@ -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.
|
Loading…
x
Reference in New Issue
Block a user