장고 파이썬 쉘로 데이터 조작하기

jurin·2021년 7월 13일
0

Admin 사이트가 UI로 보면서 데이터를 관리할 수 있어 편리하다면, 쉘 데이터 처리는 복잡한 조건 검색처럼 더 다양한 데이터 관리 명령이 가능하다.

따라서 복잡한 데이터 처리 또는 별도로 웹 브라우저로 접속할 필요가 없는 경우 쉘로 데이터를 처리하는 것이 보통이다.

python manage.py shell 명령어로 파이썬 쉘을 시작한다.

장고 파이썬 쉘 명령도 역시 파이썬 쉘이지만 파이썬 쉘과 다른 점은 manage.py 모듈에서 정의한 DJANGO_SETTINGS_MODULE 속성을 이용하여 미리 mysite/setting.py 모듈을 임포트한다는 것이다.

테이블은 레코드의 모음이라고 할 수 있는데 장고의 ORM은 이러한 테이블의 구조를 클래스로 표현한다. 클래스의 객체를 생성하는 것 = 테이블의 레코드를 생성하는 것

Create

테이블에 레코드를 생성하기 위해 필드값을 지정하여 객체를 생성한 후에 save() 메소드를 호출하면 된다. save() 명령이 실행되기 전에는 메모리에서만 변경된 것이고 save() 명령이 실행되면 내부적으로 SQL 용어의 INSERT 문장을 실행한다.

Read

DB로부터 데이터를 조회하기 위해 Queryset 객체를 사용한다. QuerySet은 DB 테이블로부터 꺼내온 객체들의 콜렉션이다. QuerySet은 필터를 가질 수 있으며 필터를 사용하여 QuerySet 내의 항목 중에서 조건에 맞는 레코드만 다시 추출한다. SQL 용어로 QuerySet은 SELECT 문자에 해당되며 필터는 WHERE 절에 해당한다.

콜렉션이란?
다수의 객체를 한 곳에 모아서 각 객체들을 동일한 방식으로 다룰 수 있도록 해주는 데이터 구조

조회 결과를 담는 QuerySet을 얻으려면 objects 객체를 사용한다. objects 객체는 테이블 정보를 담고 있는 객체이다.

>>> Question.objects.all() 	# 'Question테이블.레코드들.모두' 라고 해석하면 된다.

모든 레코드가 아닌 일부 레코드만 검색할 경우 filter()와 exclude() 메소드를 사용한다.

  • filter() : 주어진 조건에 맞는 객체들을 담고 있는 QuerySet 콜렉션 반환
  • exclude() : 주어진 조건에 맞는 객체들을 제외한 QuerySet 콜렉션 반환

이런 QuerySet 메소드들은 실행 결과 또한 QuerySet 콜렉션을 반환하므로 체인식 호출이 가능하다.

>>> Question.objects.filter(
		question_text__startswith='What'
).exclude(
	pub_date__gte=datetime.date.today()
).filter(
	pub_date__gte=datetime(2005, 1, 30)
)

한 개의 요소만 있는 것이 확실한 경우에는 get() 메소드를 호출하면 된다. 호출 결과는 QuerySet이 아니라 한 개의 객체이다.

>>> one_entry = Question.objects.get(pk=1)

또한 QuerySet 요소의 개수를 제한하기 위해 파이썬의 배열 슬라이싱 문법을 사용할 수도 있다. SQL 용어로 OFFSET, LIMIT 절에 해당한다. 실행 결과는 QuerySet이 아니라 리스트를 반환한다.

>>> Question.objects.all()[:5]
>>> Question.objects.all()[5:10]
>>> Question.objects.all()[:10:2]

Update

존재하는 객체에 대한 필드값을 수정하는 경우에도 필드 속성값을 수정한 후 save() 메소드를 호출하면 된다. SQL 용어로 UPDATE에 해당한다.

>>> q.question_text = 'What is your favorite hobby ?'
>>> q.save()

여러 개의 객체를 한번에 수정할 때에는 update() 메소드를 사용한다.

>>> Question.objects.filter(pub_date__year=2007).update(question_text='Everything is the same')

Delete

pub_date가 2005인 모든 객체 삭제

>>> Question.objects.filter(pub_date__year=2005).delete()

Question 클래스의 모든 객체, 즉 Question 테이블의 모든 레코드 삭제

>>> Question.objects.all().delete()

voting 애플리케이션 데이터 실습

모든 레코드를 조회하는 등의 단순 조회 실습

filter() 함수 등을 이용하여 다양한 조건으로 조회하고, 1:N 관계로 연결된 테이블 ㄱ나에 필요한 작업 실습





출처: Django로 배우는 파이썬 웹 프로그래밍(기초) - 김석훈님

profile
anaooauc1236@naver.com

0개의 댓글