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

23407 단어 flaskprismapython
안녕하세요 👋! 이 가이드에서는 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:postgres_password@localhost: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 인 경우 데이터베이스에서 모든 사용자를 검색하고 그 후에 사전 목록으로 형식을 지정하기 위해 목록 이해를 사용합니다(Flask 때문에 이렇게 해야 합니다. 해당 모델을 반환합니다). 요청이 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를 만들었습니다. 목록 및 생성 끝점은 사용자와 동일합니다. 또한 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 을(를) 생성한 것을 기쁘게 생각합니다. 🔥🔥

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

    좋은 웹페이지 즐겨찾기