[Django] CRUD

LILO Ghim·2021년 11월 21일
0

CRUD 1
create / read / update / delete

ORM

서로 다른 시스템을 mapping해준다
(django : python으로 이루어진 코드 덩어리(소스코드))

django에서는,
클래스로 만들어진 하나의 인스턴스와 mysql 데이터 테이블과 매핑해주는 개념
'person' class(파이썬 코드)가 'person' table(2차원 표)이 되는 것

makemigration : 클래스를 테이블로 만들어줌
migrate : 설계도를 반영하는 것(row sql로 바꿔줌)

-> models.Model을 상속 받은 클래스를 읽어서 설계도를 만들어준다


CREATE

Person.objects.create(name = "", age = "", job = "")

objects > 상속 받은 model 클래스의 속성
create > manager class의 method > sql insert 문으로 바뀌어서 들어감


READ

Person.objects.get(id=1) : 하나의 값만 가져옴(객체로 반환)


UPDATE/DELETE

Person.objects.filter(age=33).update(job=Firefighter)
Person.objects.filter(age=33).delete()

*soft deleting

데이터의 중요도에 따라서 사용자에게는 지워진것처럼 보여지지만, deleted column(삭제여부) 같은 것을 만들어서 실제로는 지우지 않고 데이터베이스에 남겨둔다. delete action을 누가 했는지, 어떤 요청으로 지워졌는지도 별도로 데이터 이력 관리를 한다.
*hard delete는 행 자체를 삭제 함

soft deleting을 했다면, SQL의 UPDATE 명령어를 이용하여 삭제여부 컬럼의 값을 True로 바꾸고, 실제 서비스에서 클라이언트에게 보낼 때는 삭제여부값이 0인 행만 보내준다.


CRUD 2


1. 가상 서버 생성

httpie request를 만들어서 요청을 받을 수 있는 api server를 만들고, 데이터베이스에서 확인한다.

uri http -v POST http://127.0.0.1:8000/target

  • 해당 어플리케이션마다 고유한 포트번호가 있고, 해당 application으로 request를 보낸다. 예를 들어, mysql : 3306, django : 8000
  • startline : http method /target(요청을 보내는 가장 마지막) http의 버전
  • header : Content-Type : application/json > body 부분에 json data 형태로 담긴다
  • body : python의 dictionary


2. URLconf

url로 data를 request하는데, 실제로 request 들어온 url이 해당 server에 정의 되어 있는 url인지 판단을 해서 url과 mapping되어 있는 view라는 모듈을 실행시켜준다. (view : request를 처리하는 logic이 담겨있다.)


# urls.py
from django.urls import path, include 

urlpatterns = [
    path('actors/', include('actors.urls'))
] 

# actors라는 타겟으로 들어오는 요청을 전부 actors app 안에 actors.urls로 라우팅(요청을 전가) 시켜달라

----------------------------------------------------------------------------------------

#app.urls.py
from django.urls        import path
from actors.views       import ActorsView, MoviesView

urlpatterns = [
    path('', ActorsView.as_view()), 		#view 함수 실행
    path('movies/', MoviesView.as_view())
]

3. View

  • convention : built-in module > 외부 module > 사용자 정의 module

  • View 클래스를 상속 받아 class 선언

  • Handler method : post/get 함수를 만든다(delete/patch, put).

  • target으로 들어오는 request에 따라 함수(method)가 실행된다
    (하나의 class 안에 하나의 method만 만들 수 있다.).

  • method 내에는,
    1. 함수의 목적
    : 예를 들어 정보를 데이터 베이스에 생성하는것이 목적인지 - client request에 맞게 고객정보를 db에 등록(owner table에 등록 > owner model을 사용한다)
    2. Input : request한 정보
    3. data base에 정보 등록
    4. Output : status code, 등록된 정보(data base)의 id(PK), message SUCCESS 등으로 알려줌

  • data=request.body

    Input은 http body에 있는데,
    django 가 request라는 객체를 만들어서, 객체의 body라는 속성에 http 메세지의 body에 있는 데이터들을 담아서 함수(method)를 실행할 때 전달

  • data = json.loads(request.body)
    데이터를 딕셔너리 형태로 바꿔서 python에서 사용할 수 있도록 변환

    actors라는 target으로 Post request를 보냈고, url conf에서 actors라는 target에 mapping 되어 있는 view를 실행시킨다. > Post handler 함수 실행 > http의 request message body 부분에 있던 data들을 django가 request라는 객체 내의 body라는 속성에 담아서 Post handler 함수의 첫번째 인자로 넘겨줬음 > json type의 data를 python에서 다루는 dictionary type으로 바꿔주고(json.loads), data table을 생성시켜준 후 client에게 JsonResponse해준다.

  • get

    보여주고자 하는 내용을 담는데, api에서 한 번 더 렌더링 후 client로 보내준다.

  • api를 생성하는데 만났던 여러가지 오류들이 있었는데, 몇 가지 대표적인 오류

  1. not found : url path의 문제('/')

  2. serializable : json 데이터 타입으로 변환

  3. server : server를 안 킨 경우

  4. keyerror : dictionary 상의 잘못된 key나 오타

  5. IntegrityError

    예를 들어, 이미 등록된 사용자를 Post request 하는 경우, 에러메세지가 발생하는데 이 때 해결 할 수 있는 방법은,

    • if 조건으로 데이터 생성 이전에 한번 에러를 return하는 방법
    • full_clean()
    • IntegrityError를 return 하는 방법

IntegrityError를 return 하는 방법을 사용하였더니, 등록된 사용자(emil)를 한번 error를 내고, 이후 새로운 사용자(email)를 등록할 시에 id(pk)를 건너 뛰는 문제를 발견하였다.
data를 create하기 이전에 if 조건문으로 등록된 email인지 exists로 검사를 하도록 수정. IntegrityError 발생 후, Post request를 다시 하였더니, id가 제대로 생성되는 것을 확인하였다.
full_clean()을 사용하면, models에서 생성한 인스턴스들의 속성을 기준에 따라 검사를 다 해주는데, 나중에 별도의 포스팅으로 다뤄 보는 것으로,,,

profile
킴릴로

0개의 댓글