Prisma로 Flask API를 구축하기 위한 초보자 가이드

Prisma로 Flask API를 구축하기 위한 초보자 가이드

2022-10-12 last update

23 minutes reading flask prisma python
안녕하세요 👋입니다! 이 가이드에서는 Prisma를 사용하여 데이터베이스에 연결된 API를 구축하는 방법을 배웁니다.

먼저 새 가상 환경python -m venv env을 만들고 활성화합니다. Windows에서는 .\env\Scripts\activate 할 수 있습니다.

이제 이 프로젝트에 필요한 패키지를 설치해 보겠습니다.

pip install flask prisma


완료되면 app.py 라는 새 파일을 만들고 플라스크 앱이 작동하는지 확인하기 위해 상용구를 넣어 보겠습니다.

from flask import Flask

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index():
  return {
    "ping": "pong"
  }


if __name__ == "__main__":
  app.run(debug=True, port=5000, host='0.0.0.0')


이제 python app.py로 앱을 시작하고 http://127.0.0.1:5000/로 이동하면 엔드포인트 응답 🎉이 표시되어야 합니다.

데이터베이스 모델



프리즈마 부분으로 가자. 먼저 데이터베이스를 모델링해야 합니다. 이 예에서는 사용자와 게시물이 있다고 가정해 보겠습니다.
저는 sqlite 를 사용할 것이지만, postgres와 같은 다른 것을 사용하려면 providerurl 를 변경해야 합니다. 예를 들면 다음과 같습니다.

datasource db {
  provider = "postgresql"
  url      = "postgresql://postgres_user:[email protected]:5432/db_name"
}

schema.prisma라는 파일을 만들고 그 안에 다음을 넣습니다.

datasource db {
  provider = "sqlite"
  url      = "file:database.db"
}

generator db {
  provider  = "prisma-client-py"
  interface = "sync"
}

model User {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  email     String   @unique
  name      String?
  posts     Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  published Boolean  @default(false)
  title     String
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int
}




여기에 사용자와 게시물 사이에 one to many relationship가 있습니다.
Prisma 스키마에서 관계를 구축하는 방법에 대해 자세히 알아보려면 공식 jsdocumentation를 확인하세요.

이제 Prisma로 데이터베이스를 생성해 봅시다. 다음을 사용하여 마이그레이션을 생성하면 됩니다.

prisma migrate dev


및 마이그레이션에 대한 이름을 제공합니다(예: init).
그 후에 루트 폴더 안에 sqlite 데이터베이스가 생깁니다.

파이썬과 프리즈마



이제 파이썬 쪽에서.
Flask에 Prisma를 등록해 봅시다.

from flask import Flask
from prisma import Prisma, register

db = Prisma()
db.connect()
register(db)
app = Flask(__name__))

# rest of the file
...


경로



저는 경로를 정리하는 것을 좋아하므로 routes라는 폴더를 만들고 그 안에 다음 내용이 포함된 user.py라는 파일을 만들어 보겠습니다.

from flask import Blueprint, request
from prisma.models import User

user_blueprint = Blueprint('user', __name__)

@user_blueprint.route('/', methods=['GET','POST'])
def list_create():
  if request.method == 'GET':
    users = User.prisma().find_many(include={'posts': True})
    return {
      "data": [user.dict() for user in users]
    }

  if request.method == 'POST':
    data = request.json

    if data is None:
      return

    name = data.get('name')
    email = data.get('email')

    if name is None or email is None:
      return {"error": "You need to provide name and email"}

    user = User.prisma().create(data={'email': email, 'name': name})

    return dict(user)



그런 다음 app.py 내부에 청사진을 등록해야 합니다.

from flask import Flask
from prisma import Prisma, register
from routes.user import user_blueprint
# from routes.post import post_blueprint

db = Prisma()
db.connect()
register(db)

app = Flask(__name__)

@app.route('/', methods=['GET'])
def index():
  return {
    "ping": "pong"
  }

app.register_blueprint(user_blueprint, url_prefix='/user')
# app.register_blueprint(post_blueprint, url_prefix='/post')

if __name__ == "__main__":

  app.run(debug=True, port=5000, threaded=True)


그리고 이제 다음 페이로드가 있는 http://127.0.0.1:5000/user 메서드로 엔드포인트POST에 도달하면:

{
    "name": "Mihai2",
    "email": "[email protected]"
}


생성된 사용자를 받게 됩니다.

{
    "data": [
        {
            "createdAt": "Fri, 01 Jul 2022 07:25:34 GMT",
            "email": "[email protected]",
            "id": 1,
            "name": "Mihai2",
            "posts": null
        }
    ]
}


이제 프리즈마 부분을 조금 설명하겠습니다. prisma.schema에서 만든 모든 모델은 이제 prisma.models에서 사용할 수 있으며 다음과 같이 사용할 수 있습니다.

from prisma.models import User


해당 모델을 사용하여 create, update, find_many 등과 같은 특정 쿼리를 만들 수 있습니다. 모든 쿼리here와 모델 기반 접근here을 확인할 수 있습니다.
요청 방법이 GET 인 경우 데이터베이스에서 모든 사용자를 검색하고 그 후에 사전 목록으로 형식화하기 위해 목록 이해를 사용합니다. 해당 모델을 반환). 요청이 POST 이면 데이터베이스에 해당 레코드를 생성하고 사전으로 반환합니다.
Prisma는 매우 우수한 자동 완성 기능을 제공하므로 VSCode를 사용하는 경우 ctrl + space가 가장 좋은 친구입니다 😀 그리고 대부분의 경우 문서가 필요하지 않습니다.

이제 포스트 루트를 만들어 봅시다. 마찬가지로 routes 폴더에 청사진이 있는 post.py 파일을 만듭니다.

from flask import Blueprint, request
from prisma.models import Post

post_blueprint = Blueprint('post', __name__)

@post_blueprint.route('/', methods=['GET','POST'])
def list_create():
  if request.method == 'GET':
    posts = Post.prisma().find_many()
    return {
      "data": [post.dict(exclude={'author'}) for post in posts]
    }

  if request.method == 'POST':
    data = request.json

    if data is None:
      return

    title = data.get('title')
    published = data.get('published')
    authorId = data.get('authorId')

    if title is None or published is None or authorId is None:
      return {"error": "You need to provide title, published and authorId"}

    post = Post.prisma().create(data={'title': title, 'authorId': authorId, 'published': published })


    return post.dict()

@post_blueprint.route('/<int:id>', methods=['GET','PUT', 'DELETE'])
def view_update_delete(id):
  if request.method == 'GET':

    post = Post.prisma().find_unique(where={'id': id}, include={'author': True})
    if post is None:
      return {'error': 'Post doesn`t exist'}, 404

    return post.dict()

  if request.method == 'PUT':
    data = request.json

    if data is None:
      return

    title = data.get('title')
    published = data.get('published')
    authorId = data.get('authorId')

    if title is None or published is None or authorId is None:
      return {"error": "You need to provide title, published and authorId"}

    post = Post.prisma().update(where={'id': id }, include={'author': True}, data={'title': title, 'published': published, 'author': {'connect': {'id': authorId}}})

    if post is None:
      return {'error': 'Post doesn`t exist'}, 404

    return post.dict()

  if request.method == 'DELETE':
    post = Post.prisma().delete(where={'id': id})
    if post is None:
      return {'error': 'Post doesn`t exist'}, 404

    return post.dict(exclude={'author'})


그리고 청사진을 app.py 에 추가하십시오.

from routes.post import post_blueprint
app.register_blueprint(post_blueprint, url_prefix='/post')


게시물 경로에 대해 전체 CRUD API를 만들었습니다. list 및 create endpoint는 사용자와 동일합니다. 또한 3가지 유형의 요청을 처리하는 view_update_delete 함수를 만들었습니다.
  • GET http://127.0.0.1:5000/post/1 -> 특정 ID를 가진 데이터베이스에서 레코드를 검색하고 반환합니다.
  • PUT http://127.0.0.1:5000/post/ -> 제공된 특정 ID와 페이로드로 데이터베이스의 레코드를 업데이트하고 업데이트된 레코드를 반환합니다.
    페이로드 예:

  • {
        "title": "Post1 updated",
        "published": false,
        "authorId": 1
    }
    


  • DELETE http://127.0.0.1:5000/post/1 -> 데이터베이스에서 해당 레코드를 삭제하고 반환합니다.

  • 그리고 바로 🎉! 이제 Prisma로 데이터베이스와 상호 작용하기 쉽기 때문에 앱을 시작하고 더 많은 기능을 추가할 수 있습니다.

    나는 자바스크립트에서 Prisma를 사용하는 것을 정말 즐겼고 Robertclient for python 를 생성하게 되어 기쁩니다. 🔥🔥

    질문이 있으면 의견에서 논의할 수 있습니다. 💬