데이터베이스와 소통하는 백엔드 웹 개발의 기본기능은 데이터의 생성, 읽기, 수정, 삭제의 4가지 기능이다. 이번에는 django shell을 통해 데이터베이스와 소통하는 방식에 더하여 객체와 쿼리셋의 개념 등을 같이 정리하고자 한다.
shell은 manage.py를 통해 사용할 수 있는 interactive interpreter로, 데이터베이스에 접근하여 작업을 할 수 있도록 한다.
python manage.py shell
로 사용이 가능하다. 입력시, 터미널에 파이썬 문법에 따르는 환경에 시작된다. 시작한 상태에서, models.py에 작성한 클래스를 import하면 데이터베이스 테이블에 접근이 가능하다.
이는 데이터베이스에 데이터를 추가하는 것이다. 방법은 2가지인데, create와 save를 이용하는 방법이다. 각각
example = Classname(attribute1='', attribute2='')
example.save()
Classname.objects.create(attribute1='', attribute2='')
이다. 모두 객체를 생성한 후 데이터베이스에 저장하는 작업을 수행한다.
이는 데이터베이스에 존재하는 데이터를 읽어오는 작업을 의미한다. 이때, 경우에 따라 객체를 반환하는 메소드와 Queryset을 반환하는 메소드가 각각 다르다. 이는 데이터를 수정하기에 앞서 읽어오는 작업이 필요할 때 중요한 의미를 가진다.
https://docs.djangoproject.com/en/3.0/ref/models/querysets/ 에서 메소드를 확인할 수 있다. 이때, 대부분의 메소드가 Queryset을 반환하지만, get()는 객체를 반환한다.
데이터베이스의 데이터를 변환하는 것을 말한다. 우선, 데이터를 읽어온 다음 값을 변환한다. 이때, 값을 어떤 형식으로 읽어오는지에 따라서 방법이 나뉜다. 우선, 객체 자체를 읽어오는 경우
example = Classname.objects.get(attribute='')
example.attribute = ''
example.save()
로 수행한다. 하지만, 위의 방법으로는 한번에 한 객체만을 바꿀 수 있기 때문에, 여러 객체의 데이터를 한번에 바꾸려면 다른 방법을 쓸 필요가 있다.
example = Classname.objects.all()/.filter(attribute='')/.etc
example.update(attribute='')
or
Classname.objects.all()/.filter(attribute='')/.etc.update(attribute='')
로 바꾸어 줄 수 있다.
이는 데이터베이스의 데이터를 지운다. 메소드는 다음과 같다.
Classname.objects.filter(attribute='').delete()
객체는 데이터베이스에 값이 저장되어 있는 형식이다. 데이터베이스 테이블의 가로 값 각각이 객체 하나이며, 딕셔너리형태로 저장되어 있어 {'세로1':'가로1', '세로2':'가로1'}형태로 저장되어 있다고 볼 수 있다. 반면, Queryset은 객체들이 리스트의 형태로 저장된 것이다.[{'세로1':'가로1', '세로2':'가로1'}, {'세로1':'가로1', '세로2':'가로1']인 것이다. 그렇기 때문에, shell이 데이터베이스에서 자료를 어떤 형식으로 불러오는지에 따라 접근하는 방식이 달라진다.