Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- python
- tkinter Radio 동적버튼
- Django
- SQL
- GraphQL
- graphene-django
- numpy
- allauth
- FastAPI
- flask
- for loop
- Django-allauth
- check_password
- array
Archives
- Today
- Total
객
Graphql기반한 CRUD중 - Select 본문
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": "국립대법인"
},
.
.
]
}
}
데이터는 교육부 통계 홈페이지에서 다운받으시면 됩니다.
'[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 |