Graphql기반한 CRUD중 - Select 본문

[PL]/Python

Graphql기반한 CRUD중 - Select

객과 함께. 2021. 9. 13. 18:00

graphql 대하여 인터넷에서 찾아면 잘 정리되어 있는 블로그나 웹사이트들이 많이 있으므로 참고 하시길....

나름대로 공부한것을 정리 할 뿐입니다. 

 

1. graphql 쿼리 질의 방법.

2. graphql 리턴된 결과.

3. Foreign key 에 대한 조인방법

 

환경 : 윈도우즈10 , Mariad 10.X, python 3.X

Util : Graphene-django, venv(가상서버)  

eduapp/models.py

class elocal(models.Model) :
    lid = models.IntegerField(primary_key=True, unique=True)        # 번호
    llocal = models.CharField(max_length=20, db_column='llocal')   # 지역명

class  edu(models.Model) :
    eid  = models.IntegerField(primary_key=True, unique=True)      # 번호
    eName = models.CharField(max_length=80, db_column='eName')  #대학명
    eCode = models.CharField(max_length=7, db_column='eCode')     # 학교코드
    eDiv = models.CharField(max_length=30, db_column='eDiv')         # 구분1
    eSchooldiv = models.CharField(max_length=20, db_column='eSchooldiv') # 구분2 
    eLocal = models.ForeignKey(elocal, on_delete=models.CASCADE, related_name='eLocal', db_column='eLocal') # 지역 
    eSetupdiv = models.CharField(max_length=10, db_column='eSetupdiv') # 구분 3 (사립, 국립등)
    eMajor = models.CharField(max_length=80, db_column='eMajor')  # 학과, 학부, 전공
    eState = models.CharField(max_length=20, db_column='eState') # 구분 4(기존, 폐지 등)
    eAffi = models.CharField(max_length=20, db_column='eAffi')  # 구분 5 (계열 )
    eDegree = models.CharField(max_length=20, db_column='eDegree') #구분6 (전문학사,학사, 석사, 박사) 

테이블을 DB에 먼저 만들어 놓았으며 그것과 연결 하기 위해서 "db_column"을 사용 하였습니다. 

 

eduapp/urls.py

from django.urls import path
from django.views.decorators.csrf import csrf_exempt
from graphene_django.views import GraphQLView
from .schema import schema
urlpatterns = [
   path('graphql/', csrf_exempt(GraphQLView.as_view(graphiql=True, schema=schema))),
]

eduapp/schema.py

import graphene
from graphene_django import DjangoObjectType
from .models import edu, elocal
class EduType(DjangoObjectType) :
    class Meta :
        model = edu 
class ELocalType(DjangoObjectType) :        
    class Meta :
        model = elocal
class EduQuery(graphene.ObjectType) :  
    dept = graphene.List(EduType,  eMajor=graphene.String(required=True), eno=graphene.String(required=True))
    school = graphene.List(EduType, eName=graphene.String(required=True), eno=graphene.String(required=True))
    def resolve_dept(self, info, eMajor, eno) :
        if eno.__eq__("1"):
            return edu.objects.all().filter(eMajor=eMajor, eState = "기존", eDiv="전문대학")
        elif eno.__eq__("2") :
            return edu.objects.all().filter(eMajor=eMajor, eState = "기존", eDiv="대학")
        elif eno.__eq__("3") :
            return edu.objects.all().filter(eMajor=eMajor, eState = "기존", eDiv="대학원")  
        else :
            pass
    def resolve_school(self, info, eName, eno) :    
        if eno.__eq__("1") :
            return edu.objects.all().filter(eName=eName,  eState = "기존", eDiv="전문대학")
        elif eno.__eq__("2") :
            return edu.objects.all().filter(eName=eName, eState = "기존", eDiv="대학")    
        elif eno.__eq__("3") :
            return edu.objects.all().filter(eName=eName, eState = "기존", eDiv="대학원")    
        else : 
            pass
schema = graphene.Schema(query=EduQuery)

 

Graphql Query 예제

1) 학과 설치된 대학 쿼리 예문

query one{
  dept(eMajor:"태권도학과", eno:"2") {
    eid
    eName
    eAffi
    eSetupdiv
  }
}

위 쿼리 태권도 학과가 어느 대학에 개설 되어 있는지 물어보는 쿼리 이다. 결과는 아래와 같다. 

{
  "data": {
    "dept": [
      {
        "eid": 7376,
        "eName": "경희대학교",
        "eAffi": "예체능계열",
        "eSetupdiv": "사립"
      },
      {
        "eid": 7938,
        "eName": "계명대학교",
        "eAffi": "예체능계열",
        "eSetupdiv": "사립"
      },
      {
        "eid": 12019,
        "eName": "나사렛대학교",
        "eAffi": "예체능계열",
        "eSetupdiv": "사립"
      },
    .
    .
  ]
  }
}

 

2). 대학내에 설치된 학과 쿼리예제.

query two{
  school(eName:"고려대학교", eno:"2") {
    eMajor
    eAffi
    eLocal{
      llocal
    }
    eSetupdiv
  }
}

위 쿼리의 결과 는 아래와 같다. 

{
  "data": {
    "school": [
      {
        "eMajor": "간호학과",
        "eAffi": "자연과학계열",
        "eLocal": {
          "llocal": "서울"
        },
        "eSetupdiv": "사립"
      },
      {
        "eMajor": "경영학과",
        "eAffi": "인문・사회계열",
        "eLocal": {
          "llocal": "서울"
        },
        "eSetupdiv": "사립"
      },
      {
        "eMajor": "건축사회환경공학부",
        "eAffi": "공학계열",
        "eLocal": {
          "llocal": "서울"
        },
        "eSetupdiv": "사립"
      },
    .
    .
  ]
  }
}

 

위 와 같이 각각 쿼리를 날려도 되고 합쳐서 날려되 되는 것에 좋았다.  한번에 두개의 쿼리의 결과를 얻을 수있다.

마지막 예제로 위의 두개의 쿼리를 한꺼번에 날릴 수 있었다. 

 

3) 위 두개 쿼리를 한꺼번에 날리는 예제

query three{
  dept(eMajor:"체육학과", eno:"2") {
    eid
    eName
    eCode
    eAffi
    eSetupdiv
  }
  school(eName:"서울대학교", eno:"2") {
    eMajor
    eAffi
    eLocal{
      llocal
    }
    eSetupdiv
  }
}

위의 쿼리에서  "eLocal" 를 보시게 되면 이부분이 elocal.lid 와 edu.eid를 조인를 걸어 결과는 지역을 나타나게 되고

위 두개의 쿼리 결과는 아래와 같이 받을 수 있다. 

{
  "data": {
    "dept": [
      {
        "eid": 1326,
        "eName": "강릉원주대학교",
        "eCode": "0000001",
        "eAffi": "예체능계열",
        "eSetupdiv": "국립"
      },
      {
        "eid": 3493,
        "eName": "경기대학교",
        "eCode": "0000056",
        "eAffi": "예체능계열",
        "eSetupdiv": "사립"
      },
                .
                .
  ],
    "school": [
      {
        "eMajor": "간호대학",
        "eAffi": "자연과학계열",
        "eLocal": {
          "llocal": "서울"
        },
        "eSetupdiv": "국립대법인"
      },
      {
        "eMajor": "간호학과",
        "eAffi": "자연과학계열",
        "eLocal": {
          "llocal": "서울"
        },
        "eSetupdiv": "국립대법인"
      },
                  .
                  .
   ]
  }
}

데이터는 교육부 통계 홈페이지에서 다운받으시면 됩니다. 

 

 

 

 

 

education-graphql_example.zip
0.02MB

 

'[PL] > Python' 카테고리의 다른 글

[Django] Graphql 기반 - Create, Update  (0) 2021.09.16
[Django] Django ORM  (0) 2021.09.13
[Django] Django ORM  (0) 2021.09.13
[정리중] Django ISSUE  (0) 2021.07.17
DJANGO settings.py 의 db(Postgresql, cubrid, sqlite3, mariadb)설정  (0) 2013.12.05