티스토리 뷰

Web/Django

[Django] ORM

HAN_PY 2020. 6. 24. 08:53
반응형

SQL

BD 조작언어이다. 우리는 장고를 사용할 때 ORM 으로 쓴다. Flask는 다른 ORM을 가진다. 

Object = 객체(python)

Relational = DB라고 생각하자

Mapper = 위의 2개를 연결

즉, python 객체조작(method호출)으로 DB를 조작한다.

ORM은 DB와 객체사이에서 Mapping 해준다.

 

ORM(Object Relational Mapping)

  • CRUD하기 위해 필요한 개념이 ORM
  • 객체조작을 통해 DB를 조작
  • 다양한 SQL에 상관없이 개발가능
  • DB 조작을 python 코드로 가능
  • Object 조작을 통해 데이터 베이스를 조작

 

Article object를 조작해보자.(Article class를 모델에 만든 후의 상황)

>pip install django-extensions ipython

위의 2개의 python 패키지를 설치하자. CLI 환경으로 넘어 갈 건데, 편하게 보기 위해서 위의 2가지를 설치한거다.

settings.py의 INSTALLED_APPS에 아래처럼 추가하자.

'django_extensions',

'articles',(app등록한 위치보다 위에 적자.)

 

>python manage.py shell_plus

shell_-plus의 특징은 관련된 모델들을 import 해주는게 특징이다. 주피터 노트북처럼 뜬다. 그러면 이제 DB에 저장된 게시물을 object 조작으로 사용가능하다.

 

+ 에러발생] ModuleNotFoundError: No module named 'django-extensions'

이러한 에러의 경우는 app을 추가할 때 django-extensions가 아니라 django_extensions 를 적어야한다. 설치이름과 등록이름이 다른 라이브러리가 있으니 주의하자.

 

>Article

<articles.models.Article

 

> Article.objects.all() 

< Queryset [<Article: Article object (1)>]

유사 리스트 형태로 전체 데이터를 다 가져온다. 위에 처럼 return타입은 Queryset(유사리스트)로 Article 자체의 object가 리스트 형식으로 뜬다.

 

즉, ORM은 DB값을 변환해서 object로 보여준다. 변경을 하면 sqp로 바꿔서 변경을 해준다. 만약 SQL문으로 적으면 표(table) 형식으로 보여준다.

 

> Article.objects.all()[0].title

< 1변글의 내가 적은 title 부분이 출력된다.

> Article.objects.all()[0].content

< 1번글의 내용이 출력된다.

 


 

Article.objects.all() 뜻,

어떤 class(Article)의 쿼리 method(objects.all)를 쓰면 출력이 되고, 그것에 대은되는 SQL 문이 있다.

 

 

> python manage.py sqlmigrate articles 0001

SQL문이 뜬다 - sqlmigrate

app 이름 - articles

마이그레이션 파일 - 0001

 


게시판에서 글을 쓸 때 DB입장에서 어떠한 작업을 하는가??

Create 쓰고 생성
Read 읽고 조회
Update 수정하고 수정
Delete 삭제 삭제

DB를 SQL없이도 조작가능하다. 즉, 각각의 DB를 Method조작(객체조작)

 

CREATE(생성)

 

python의 인스턴스 만들기와 비슷하다고 보면 된다.

class Person()

P1 = Person()

P1.name = "hanpy"

 

>article = Article()                            :  Article을 비어있는 article 변수에 저장하여 인스턴스를 만든다.

>article.title = '제목입력'

>article.content = '내용입력'               :   속성값을 입력

>article

< <Article : Article object (None)>       :  비어있다고 뜬거다.

>article.save()                                  :  이렇게 저장을 해줘야한다.

 

>Article.object.all()

<QuerySet [<Article:Article object (1)>, <Article:Article object (2)>]>         : <Article:Article object (2)>이 생성됨

 

>article

<Article:Article object (2)>                     : 실제 DB에 값이 저장되었다. 위의 흐름을 기억 할 필요가 있다.

 

> Article.objects.all()[1]

<Article:Article object (2)>

 

>Article.objects.all()[1].title

'제목입력'

 


READ(조회)

모든 데이터 조회

>Article.object.all()

<QuerySet [<Article:Article object (1)>, <Article:Article object (2)>]>

 

단일 데이터 조회

>Article.object.get(id=2)

< <Article:Article object (2)>

 

조회 시 주민번호, 학번, 군번 등으로 식별번호를 사용한다. (고유값)

일반적으로 id로 식별번호를 부여한다.

id는 식별번호이자 Primary key(PK)라고도 한다. DB는 중복 불가하다.

즉, 일반적으로는 Primary key라고 부르지만 column의 이름을 id라고 한다.

 


UPDATE(수정)

> a2 = Article.objects.get(id=2)                            : a2라는 변수로 가지고 온다

> a2.title = '제목수정'                                        : 속성 변경

> a2.save()                                                      : save method 호출

 

> new_a2 = Article.objects.get(id=2)                     : 새롭게 불러오니 수정되어진걸 확인 할 수 있다.

> new_a2.title

< '제목수정'

 


 

DELETE(삭제)

> a1 = Article.objects.get(id=1)

> a1.delete()                                                   : 삭제 시 tuple이 리턴되어 나온다.

(1, {'article.Article': 1})

 

>Article.object.all()

<QuerySet [<Article:Article object (2)>]>

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 31
글 보관함