Рубрики
Без рубрики

Простое Fastapi Crud.

Привет! Это сообщение, чтобы получить знакомство с Fastapi. Давайте погрузимся в! Я буду структурировать … Помечено Python, Fastapi, GetStArted.

Привет! Это сообщение, чтобы получить знакомство с Fastapi. Давайте погрузимся в! Я буду структурировать этот пост на несколько разделов различных целей.

Разделы

  1. Начиная
  2. Структура проекта
  3. Входная точка
  4. База данных
  5. Моделей
  6. Трудные операции
  7. Определить конечные точки

Начиная

Чтобы начать нам нужно создать виртуальную среду и Fastapi. Создать виртуальную среду Python -M Venv Friends Активировать виртуальную среду Исходные друзья/Сценарии/Активировать

Установить fastapi PIP Установить fastapi

Нам понадобится сервер ASGI (интерфейс Asynchronous Server Gateway), в этом случае мы будем использовать Gunicorn. Пип устанавливает оружие

Структура проекта

Теперь, когда мы установили Fastapi, давайте определим структуру проекта. + – приложение |. + – в этом |. + – Crud.py |. + – db.py |. + – Модели .py + – друзья

Входная точка

Давайте отправимся на нашу main.py и напишите следующий код:

from fastapi import FastAPI

#initailize FastApi instance
app = FastAPI()

#define endpoint
@app.get("/")
def home():
    return {"Ahoy": "Captain"}

Чтобы запустить это, выполните это из вашей командировки/терминала: Увикорн Главная: App --reload ** Главная * Относится к названию нашей точки входа ** приложение * Относится к экземпляру Fastapi, который мы инициализированы с Main.py ** наград * – это флаг, который позволяет серверу перезагрузить сам, когда мы вносим изменения в проект

Откройте свой браузер на ссылка Отказ Для автоматических интерактивных API документов:

База данных

Давайте инициализируем нашу базу данных. Поскольку у нас не будет много данных, мы собираемся использовать SQLite в качестве нашей базы данных. SQLite – это встроенная библиотека Python, поэтому нам не нужно его устанавливать. В отличие от Django, Fastapi не имеет своего собственного инструмента сопоставления объектов, поэтому мы собираемся использовать SQLalchemy. Чтобы установить SQLalchemy Run PIP установить SQLALCHEMY

Перейти к вашему db.py и напишите следующее:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

#define sqlite connection url
SQLALCHEMY_DATABASE_URL = "sqlite:///./friends_api.db"

# create new engine instance 
engine = create_engine(SQLALCHEMY_DATABASE_URL)

# create sessionmaker 
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

Моделей

Давайте отправимся на Models.py Отказ Мы собираемся определить наши модели здесь.

from sqlalchemy import Column, Integer, String

from .db import Base

# model/table
class  Friend(Base):
    __tablename__ = "friend"

    # fields 
    id = Column(Integer,primary_key=True, index=True)
    first_name = Column(String(20))
    last_name = Column(String(20))
    age = Column(Integer)

Давайте вернемся к нашему main.py и сделать некоторые дополнения.

#add this to main.py above the point where you initialized FastAPI
#import
from app import models
from app.db import engine

#create the database tables on app startup or reload
models.Base.metadata.create_all(bind=engine)

После сохранения новых изменений в main.py Вы поймете, что новый файл friends_api.db создано. Это наша база данных SQLite с именем, которое мы дали в нашей строке подключения от db.py

Трудные операции

Чтобы определить операции базы данных Crud (создать, чтение, обновление и уничтожение), давайте отправимся в Crud.py и напишите следующее:

from sqlalchemy.orm import Session

"""
Session manages persistence operations for ORM-mapped objects.
Let's just refer to it as a database session for simplicity
"""

from app.models import Friend


def create_friend(db:Session, first_name, last_name, age):
    """
    function to create a friend model object
    """
    # create friend instance 
    new_friend = Friend(first_name=first_name, last_name=last_name, age=age)
    #place object in the database session
    db.add(new_friend)
    #commit your instance to the database
    db.commit()
    #reefresh the attributes of the given instance
    db.refresh(new_friend)
    return new_friend

def get_friend(db:Session, id:int):
    """
    get the first record with a given id, if no such record exists, will return null
    """
    db_friend = db.query(Friend).filter(Friend.id==id).first()
    return db_friend

def list_friends(db:Session):
    """
    Return a list of all existing Friend records
    """
    all_friends = db.query(Friend).all()
    return all_friends


def update_friend(db:Session, id:int, first_name: str, last_name: str, age:int):
    """
    Update a Friend object's attributes
    """
    db_friend = get_friend(db=db, id=id)
    db_friend.first_name = first_name
    db_friend.last_name = last_name
    db_friend.age = age

    db.commit()
    db.refresh(db_friend) #refresh the attribute of the given instance
    return db_friend

def delete_friend(db:Session, id:int):
    """
    Delete a Friend object
    """
    db_friend = get_friend(db=db, id=id)
    db.delete(db_friend)
    db.commit() #save changes to db

Мы сделаем с определением операций CRUD. Ура! 🥳.

Определить конечные точки

Мы почти закончили. Каждая отдельная строка кода, которую мы написали до сих пор, было создать для этого раздела.

Давайте вернемся к main.py : Добавьте следующее после того, как вы инициализировали свой экземпляр fastapi

from app.db import SessionLocal
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

Помните SessionLocal это связь с нашей БД. Функция get_db Это зависимость, такая, что, мы хотим, чтобы быть подключены к нашей базе данных, когда мы подключаемся или вызовете различные конечные точки.

Давайте увидим это в использовании с нашей первой конечной точкой. Добавьте это в main.py.

"""
So that FastAPI knows that it has to treat a variable as a dependency, we will import Depends
"""
from fastapi import Depends

#import crud to give access to the operations that we defined
from app import crud

#define endpoint
@app.post("/create_friend")
def create_friend(first_name:str, last_name:str, age:int, db:Session = Depends(get_db)):
    friend = crud.create_friend(db=db, first_name=first_name, last_name=last_name, age=age)
##return object created
    return {"friend": friend}

Сохранить main.py и отправиться на ваш браузер http://127.0.0.1.8000/docs и обновите страницу. Вы увидите, что у нас есть что-то новое. Так:

Нажмите на зеленый Создать друга Раздел, затем на левой стороне, нажмите Попробуйте это Отказ Заполните поля и нажмите на Blue Выполнить кнопка. В зависимости от того, что вы ввели, ваш ответ должен быть в этом формате:

{
    "first_name": "mike",
    "id": 1,
    "age": 21,
    "last_name": "dave"
}

Мы видим, что ответ – это словарь.

Давайте теперь добавим другие конечные точки для каждого из наших оставшихся трудных операций. (Пожалуйста, прочитайте комментарии в фрагментах для более легкого понимания) Получить объект друга

#get/retrieve friend 
@app.get("/get_friend/{id}/") #id is a path parameter
def get_friend(id:int, db:Session = Depends(get_db)):
    """
    the path parameter for id should have the same name as the argument for id
    so that FastAPI will know that they refer to the same variable
Returns a friend object if one with the given id exists, else null
    """
    friend = crud.get_friend(db=db, id=id)
    return friend

Список объектов друга

@app.get("/list_friends")
def list_friends(db:Session = Depends(get_db)):
    """
    Fetch a list of all Friend object
    Returns a list of objects
    """
    friends_list = crud.list_friends(db=db)
    return friends_list

Обновить объект друга

@app.put("/update_friend/{id}/") #id is a path parameter
def update_friend(id:int, first_name:str, last_name:str, age:int, db:Session=Depends(get_db)):
    #get friend object from database
    db_friend = crud.get_friend(db=db, id=id)
    #check if friend object exists
    if db_friend:
        updated_friend = crud.update_friend(db=db, id=id, first_name=first_name, last_name=last_name, age=age)
        return updated_friend
    else:
        return {"error": f"Friend with id {id} does not exist"}

Удалить объект друга

@app.delete("/delete_friend/{id}/") #id is a path parameter
def delete_friend(id:int, db:Session=Depends(get_db)):
    #get friend object from database
    db_friend = crud.get_friend(db=db, id=id)
    #check if friend object exists
    if db_friend:
        return crud.delete_friend(db=db, id=id)
    else:
        return {"error": f"Friend with id {id} does not exist"}

Вот и все сейчас!

Оригинал: “https://dev.to/mungaigikure/simple-fastapi-crud-3ad0”