Update code in endpoints/countries.post.py
This commit is contained in:
parent
aa6082d607
commit
ea6fe0e037
68
endpoints/countries.post.py
Normal file
68
endpoints/countries.post.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
Sure, here's an example of a FastAPI endpoint that adds countries to the database using SQLAlchemy models and Pydantic schemas:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from typing import List
|
||||||
|
from fastapi import FastAPI, HTTPException
|
||||||
|
from pydantic import BaseModel
|
||||||
|
from sqlalchemy import Column, Integer, String
|
||||||
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
|
from sqlalchemy import create_engine
|
||||||
|
from sqlalchemy.orm import sessionmaker
|
||||||
|
|
||||||
|
from app.api.models.countries_model import *
|
||||||
|
from app.api.schemas.countries_schema import *
|
||||||
|
from app.api.dependencies.countries_deps import *
|
||||||
|
app = FastAPI()
|
||||||
|
|
||||||
|
# SQLAlchemy setup
|
||||||
|
Base = declarative_base()
|
||||||
|
engine = create_engine('sqlite:///countries.db', connect_args={'check_same_thread': False})
|
||||||
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||||
|
|
||||||
|
# Pydantic model for country data
|
||||||
|
|
||||||
|
@app.post("/countries", response_model=List[CountryBase])
|
||||||
|
def create_countries(countries: List[CountryBase], db=Depends(get_db)):
|
||||||
|
db_countries = []
|
||||||
|
for country_data in countries:
|
||||||
|
db_country = Country(name=country_data.name, capital=country_data.capital, population=country_data.population)
|
||||||
|
db.add(db_country)
|
||||||
|
db_countries.append(db_country)
|
||||||
|
try:
|
||||||
|
db.commit()
|
||||||
|
except Exception as e:
|
||||||
|
db.rollback()
|
||||||
|
raise HTTPException(status_code=500, detail=str(e))
|
||||||
|
return db_countries
|
||||||
|
```
|
||||||
|
|
||||||
|
Here's a breakdown of the code:
|
||||||
|
|
||||||
|
1. We define a Pydantic model `CountryBase` to validate the incoming country data.
|
||||||
|
2. We define an SQLAlchemy model `Country` to represent the database table.
|
||||||
|
3. We set up the SQLAlchemy engine and session maker.
|
||||||
|
4. We define a dependency function `get_db` to provide a database session for each request.
|
||||||
|
5. We define the `/countries` endpoint using the `@app.post` decorator.
|
||||||
|
6. The endpoint takes a list of `CountryBase` objects as input and a database session (`db`) as a dependency.
|
||||||
|
7. For each `CountryBase` object in the input list, we create a new `Country` instance and add it to the database session.
|
||||||
|
8. We commit the changes to the database and return the list of created `Country` instances as the response.
|
||||||
|
9. If an exception occurs during the database operation, we roll back the transaction and raise an `HTTPException` with a 500 status code and the error message.
|
||||||
|
|
||||||
|
To use this endpoint, you can send a POST request to `/countries` with a JSON payload containing a list of country objects, like this:
|
||||||
|
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "United States",
|
||||||
|
"capital": "Washington, D.C.",
|
||||||
|
"population": 328000000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Canada",
|
||||||
|
"capital": "Ottawa",
|
||||||
|
"population": 37600000
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
The endpoint will create new rows in the `countries` table for each country in the input list and return the created country objects as the response.
|
Loading…
x
Reference in New Issue
Block a user