SQLAlchemy, graphene 및 SQLite를 구현하는 GraphQL Server가있는 Python (Flask)

간단한 SQLite3 데이터베이스와 GraphQL 및 Python (Flask)을 통합하는 간단한 서버 엔드 포인트 생성

Unsplash에 Raul Cacho Oses의 사진

TypeScript로 GraphQL에 대한 또 다른 기사를 만들었습니다. 확인하려면 여기를 클릭하십시오 .

RESTful 아키텍처에서 누락 된 특성 인 GraphQL의 가장 좋아하는 기능 중 하나 는 강력한 유형의 유효성 검사 입니다. 기본적으로 GraphQL은 게이트 키퍼 역할을하는 스키마에 대해 모든 요청의 유효성을 검사합니다. 즉, 요청이 유효성 검사를 통과하지 못하면 서버에서 어떤 작업도 수행하지 않으므로 CPU 시간이 절약됩니다 (특히 서버리스 인프라에서 중요 함). 또한 클라이언트에게 요청에 문제가 있음을 더 빨리 알립니다.

그리고 이것은 매우 중요합니다. 아시다시피 GraphQL은 단일 요청 으로 여러 데이터 포인트 (다른 엔드 포인트, 데이터베이스, 플랫 파일 또는 다른 GraphQL 서비스)에 대한 여러 쿼리를 트리거 할 수 있으므로이 필터를 문 앞에두면 불필요한 오버 헤드를 방지 할 수 있습니다.

동시에 GraphQL의 강력한 유형 특성은 IDE의 IntelliSense를 더 똑똑 하게 만들어 더 빨리 개발하고 잠재적으로 더 적은 버그로 개발하는 데 도움이됩니다.

PythonFlask 웹 프레임 워크 ( grapheneSQLAlchemy 구현) 에서 작은 프로젝트를 생성하여 GraphQL의 유형과 스키마를 살펴 보겠습니다 . 간단한 데이터베이스의 경우 Sqlite3 를 사용 합니다.

객체 관계형 매핑의 힘 🗺

쿼리 된 데이터설명 하는 기능 은 클래스, 인터페이스에 대한 스캐 폴드를 제공하고 ORM (Object-Relational Mapping) 전략을 간소화하는 데 도움이 될 수 있으므로 API 구현에 새로운 차원을 제공합니다 ( 자바 스크립트 용 Prisma , Python 용 Typescript 또는 SQLAlchemy ) .

하지만 ORM이 GraphQL를 사용하기 위해 필요하지 않습니다 , 그것은 그것으로보고 확실히 가치가있다 . ORM이 필요하지 않거나 클라이언트와 서버 간의 메시지 교환에 가치를 추가하지 않는다는 것, 데이터 소스와 구현 간의 무결성을 유지하는 데 소중하다고 생각하는 다른 사람들에 이르기까지이 주제에 대한 많은 의견이 있습니다.

위에서 언급 한 도구 (Prisma, SQLAlchemy)와 같은 도구를 사용하면 프런트 엔드에서와 같이 백 엔드에서 모두 사용할 수 있는 공통 스키마제공 할 수있는 지점까지 데이터 원본추상화 할 수 있습니다.

Python에서 GraphQL로 데모 프로젝트 만들기 🐍

시작하려면 다음 패키지가 설치되어 있어야합니다 ( requirements.txt ).

Python 3을 사용할 것입니다.

Flask==1.1.2
Flask-GraphQL==2.0.1
graphene==2.1.8
graphene-sqlalchemy==2.3.0.dev1
SQLAlchemy==1.3.17

데이터베이스 모델 🗄

Books 패키지에 추가 할 첫 번째 항목은 Models 입니다. 은 "에서 도서 / 모델 / "디렉토리 우리는 세 개의 파일을 생성합니다 : books.py , characters.pygenres.py을 .

여기에서 세 개의 클래스가 생성되었음을 알 수 있습니다. 장르 , , 캐릭터 . 본질적으로 이것들은 결국 SQLite 데이터베이스 가 될 SQLAlchemy 를 사용한 ORM 매핑입니다 . 그러나 이러한 클래스의 또 다른 장점은 GraphQL 구조에 대한 참조로 사용할 수 있다는 것입니다.

유형 정의 만들기 📚

타이핑을위한 Graphene 라이브러리.

앞서 언급 한 연결 정의는 마지막 단계에서 생성 된 ORM 파일에 대한 일대일 매핑으로 수행됩니다. 이를 위해 우리는 graphene 의 라이브러리 에 의존 할 것 입니다. “ books / types / ”디렉토리 를 생성해야합니다 . 여기에 동일한 파일을 추가하여 모델의 디렉토리에있는 books.py , characters.pygenres.py를 매핑 합니다.

이러한 클래스 는 GraphQL 쿼리에 반영되는 SQLAlchemyObjectType을 확장 합니다.

데이터베이스 시드 🌱

데이터베이스 용 SQLite 3.

데이터베이스에 초기 데이터를 저장하기 위해 마이그레이션 파일을 만들 수 있습니다. 그러나 이것은 매우 간단한 데이터베이스이므로 몇 개의 행을 삽입하는 파일을 만들 것입니다. 이 파일은 " books / database " 아래의 Books 패키지 디렉토리에도 생성됩니다 . 우리는 그것을 database.py 라고 부를 것 입니다 . 또한 base.pydb_sessions.py 가 생성되어 애플리케이션 전체에서 사용되는 데이터베이스 세션 및 기타 유틸리티를 제공합니다.

이 스크립트는 매우 간단합니다. 주요 시사점base.py의 4 행에 데이터베이스 파일` Books / database.sqlite3`생성하는 것 입니다. 그런 다음 다른 스크립트가 init_db.py 의 초기 데이터베이스에 몇 가지 장르, 책 및 문자 행을 추가합니다 .

GraphQL 스키마 📐

GraphQL의 데이터에 대한 주요 진입 점은 Schema 입니다. 이 파일에는 Query 개체, Mutation 개체 및 사용 된 유형에 대한 참조가 있습니다.

books / schema ”디렉토리에 생성되는 파일 은 schema.py , query.py , mutation.py 입니다.

두 개의 해석기에 매핑 된 query.py 파일 에서 두 개의 속성 ( Fields )을 찾을 수 있습니다. 예를 들어 books_by_genre 는 그래 핀 목록을 정의하고, 첫 번째 매개 변수 ( Books )는이 리졸버가 반환 할 요소의 유형을 나타내고 , 두 번째 매개 변수 는 리졸버 ( name )에 의해 수신 될 인수가됩니다 . 실제 리졸버 메서드는 " resolve_ " 접두사가있는 이름과 일치합니다 . 따라서 " books_by_genre " 의 해석기는 resolve_books_by_genre가 됩니다. 그런데이 방법은 SQLite ( Books and Genres ) 의 두 테이블 조인을 보여줍니다 .

input_to_dictionary ” 라는 유틸리티를 사용하고 있습니다. 이것은 input_to_dictionary.py 파일의 “ books / utils ” 디렉토리에 다음과 같이 생성 할 방법입니다.

마지막으로 Flask를 사용하여 앱을 래핑합니다.

Flask를 사용하여 GraphQL 끝점 노출 🌏

웹 프레임 워크 용 Flask.

GraphQL 엔드 포인트에 액세스 할 수 있도록 서비스를 공개적으로 노출 할 수있는 매우 가벼운 라이브러리 인 Flask 웹 프레임 워크를 사용합니다. 이 데모의 목적 상 보안과 함께 제공되는 모든 것을 다루지는 않을 것입니다. Flask의 작동 방식과 보안 엔드 포인트를 구현하는 방법에 대해 자세히 알아 보려면 여기에서 문서를 확인하세요 .

패키지의 기본 항목은 app.py (Books 패키지 내부에도 있음)입니다.

여기에서“ / graphql ” 경로를 추가하여 기본적으로 로컬 호스트 인 포트 5000에서 실행되는 GraphiQL 앱을 매핑합니다.

마지막으로 전체 앱의 진입 점 은 루트 디렉토리의 main.py입니다 .

여기에서 두 가지 작업이 실행됩니다. 첫 번째 작업은 SQLite 데이터베이스재설정 하고 두 번째 작업은 실제로 Books 패키지를 실행합니다 . 물론 이것은 데모이기 때문에 이런 식으로 수행됩니다. 이 패턴은 애플리케이션을 실행할 때마다 데이터베이스를 재설정하므로 원하지 않습니다.

python main.py 를 실행 하면 Flask 웹 프레임 워크가 나타납니다. 콘솔은 다음과 유사한 출력을 반환합니다.

앱을 실행하면 Books 패키지의 데이터베이스 디렉토리에 ` database.sqlite3` 파일이 생성 된 것을 볼 수 있습니다.

그런 다음 브라우저를 사용하여 탐색하면 :

이 인터페이스를 GraphiQL ( " Graphical " 로 발음 )이라고 하며 여기에서 GraphQL 쿼리를 실행할 수 있습니다. " 판타지 "장르 와 일치하는 모든 책을 찾아 보겠습니다 .

예를 들어 문자 가장자리를 추가하여이 책에 포함 된 문자를 요청하는 등 결과 유형을 병합 할 수도 있습니다.

데이터 추가

이 동일한 인터페이스를 통해서도 돌연변이를 사용할 수 있습니다. 이 경우에는 하나의 변형 ( createBook ) 만 있으며 다음과 같이 액세스 할 수 있습니다.

그 후에 살펴 보려는 다음 주제는 요청을 단순화 하고 Promise 와 함께 일괄 처리 를 사용 하고 마지막으로 GraphQL로 보안 및 액세스 토큰을 사용하는 데 도움이되는 데이터 로더 입니다 .

다음 내용 및 추가 자료

탐색 할 수있는 더 많은 주제 :

Apollo Server (Express) 및 SQLite SOAP, RESTful, GraphQL을 구현하는 TypeScript를 사용하는 GraphQL ORM : 올바른 통신 표준 선택 행동 기반 개발이 프로젝트에 적합합니까?

추가 읽기 :

LinkedIn , Medium , GitHub 에서 저를 찾으십시오 .

Suggested posts

Python으로 차트 주석 자동 생성

Python으로 차트 주석 자동 생성

따라서 매일 업데이트되는 최신의 아름다운 대화 형 대시 보드를 만들었으며 이제 경영진은 로그인하여 자신이 원할 때마다 판매 상황을 확인할 수 있습니다. 그러나 항상 그래프를 싫어하고 보고서에 숫자를 제공하기를 원하는 사람들이 있습니다. 그들은 차트를 클릭하지 않을 것입니다.

간단한 Python 코드로 클릭 연결을 위해 웹 페이지를 최적화하는 방법

간단한 Python 코드로 클릭 연결을 위해 웹 페이지를 최적화하는 방법

웹 페이지에서 사용자에게 표시 할 최상의 레이아웃, 이미지 및 텍스트를 선택하는 것은 어렵습니다. 그러나 반드시 그럴 필요는 없습니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.