TIL #33 Django #2 : C.R.U.D

채록·2021년 1월 21일
0

Python & Django

목록 보기
5/34
post-thumbnail

터미널 잔뜩 꾸몄다 ~🍎🍊🍋🍏🍇

🐶 들어가는 말

  • Create
  • Read
  • Update
  • Delete

Django를 이용해 database의 내용을 C.R.U.D 하기!

TIL #42 의 연습에서 이어진다. (mysql과 연동하여 runserver 확인 후 ~ C.R.U.D)



I. Table 생성


1. models.py

이전에 startapp 으로 products를 만들었을때 보면 자동으로 생성된 몇가지 파일을 확인할 수 있다.
그 중에서 models.py 가 있는데 이곳에서 class를 지정하면 하나의 class가 database에서 하나의 table이 된다.

# vi products/models.py

from django.db import models

# Create your models here.

class Product(models.Model):
        name = models.CharField(max_length=50)
        description = models.CharField(max_length=1000)

        class Meta:
                db_table='products'

table의 이름을 설정하는 것은 class Meta를 통해 할 수 있다. 참고로 table의 이름은 소문자, 복수형으로 작성하기 때문에 db_table = 'products'라고 지정하였다.
그리고 그 column으로 name과 description을 지정해 주었다.

  • name => 문자열 (최대길이 50)
  • descripion => 문자열 (최대길이 1000)

2. table 확인

지난 포스팅에서 Django와 mysql 을 연동하여 무사히 runserver가 되는 모습을 확인하였다.
단순히 연동후, products 라는 table을 만들긴 했지만 column만 지정하고 objects들은 만들지 않앗기 때문에 table을 확인해도 아무것도 존재하지 않는다.

이 연습용의 경우
beverage라는 Database에
products라는 table을 만든 것이다. 이 table은 django에서 Product라는 class로 존재한다.

use beverage

원래 mysql의 언어규칙상 뒤에 세미콜론(;)을 붙여야 한다. 하지만 use는 붙이지 않아도 상관없다
이 명령어는 beverage 라는 db를 사용하겠다.라는 의미이다.

show tables;

선택된 db의 table 종류를 확인한다.
참고로 내가 만든 table은 products 하나이다. 나머지 테이블은 테이블이 만들어지면서 자동으로 만들어진 것들이다. (django의 기능?)

SELECT * FROM products;

*은 알다싶이 "전부"를 의미한다. 즉 위 명령어는 products에 있는 모든 column을 보여주기의 기능을 수행한다.
만약 특정 column만 보려면 * 대신 column의 이름을 입력하면 된다.!

또한 SELECT 와 FROM은 소문자로 입력해도 된다.! (원랜 안됐음)

+) table이름 뒤에 세미콜론은 지우고 한칸 띄우 후 \G 를 입력하면 표 혀애가 아닌 text 들만 나온다! (아래 연습예제로 확인하기)

DESC products;

DESC는 describe의 약어이다. 따라서 위 명령어는 이 테이블에 어떤 column, 어떤 type, pk, fk 등 상세 정보를 알려주기의 기능을 수행한다. 테이블 형태로 나온다!



II. Create

만든 table에 object를 create 해보자!
database의 table에 데이터를 추가하는 방법은 두가지가 있다.
1. Request 하기
2. Django가 제공하는 interactive shell 사용하기.

이번에는 2번의 방법을 사용하였다.! (이후 각 방법에 대한 포스팅 작성할 예정)

1. Django shell 켜기

manage.py 가 있는 directory에서 다음의 명령어를 입력한다.

./manage.py shell

그럼 다음 사진과 같이 shell이 활성화 된다.


2. class 갖고오기

데이터를 넣을 class를 갖고온다.
비록 지금 연습에서는 class가 단 한개뿐이지만... 나중엔 많아질꺼다....

>>> from products.models import Product

위 명령어를 입력해서 아무 변화도 없어야 한다.
있다면.. 그건.. 에러일 것이야..


3. object 확인하기

아무것도 안만들었기 때문에 가져올게 없다는걸 알지만! create 하기 전 어떤 모습으로 명령어가 출력될지 입력해본다.

>>> Product.objects.all()
<QuerySet[]>

+) 참고로 Django에서는 데이터를 list의 형태로 출력하는데 이때의 출력 형태를 list가 아닌 Queryset이라고 한다. list와 유사하지만 다른 점 크게 한가지는 -1번째의 값 출력이 안된다.! (-1이 안됨)


4. object create 하기

create 하기 위해서 다음의 명령어를 입력한다

>>> Product.objects.create(name='몽글몽글 딸기에이드', description='딸기맛 젤리와 함께 마셔요')
<Product: Product object (1)>

하는김에 하나 더 만든다

>>> Product.objects.create(name='초코쿠키 프라푸치노', description='오레오맛 프라푸치노. 맛있어요!')
<Product: Product object (2)>

5. table에서 확인하기

총 2개의 object를 만들었다. table로 확인해보자.

mysql> SELECT * FROM products;
+----+----------------------------------------------+
| id | name               | description             |
+----+----------------------------------------------+
|  1 | 몽글몽글 딸기에이드     | 딸기맛 젤리와 함께 마셔요     |
|  2 | 초코쿠키 프라푸치노     | 오레오맛 프라푸치노. 맛있어요! |
+----+------------------------------+---------------+
2 rows in set (0.00 sec)

mysql>



III. Read

read는 말 그대로 데이터를 읽는 것이다. 특정 데이터를 읽는 법은 두가지가 있다.

  • get
  • filter

1. get

get은 단 하나의 object만을 출력한다. 때문에 get은 다음과 같은 형태로 명령어를 입력한다. (class 이름은 Product이다.)

>>> Product.objects.get(id=1)
<Product: Product object(1)>

객체 하나가 출력된다.


2. filter

filter는 말 그대로 조건을 통해 거른다 때문에 다수의 objects를 출력할 수 있으며, 이때 형태는 QuerySet의 형태로 출력된다.

>>> Product.objects.filter(id=1)
<QuerySet [<Product: Product object (1)>]>




IV. Update

게임에서 많이 본 Update! 데이터를 업데이트 한다.
즉, 수정하기!
다음의 명령어를 입력해 몽글몽글 딸기에이드의 description을 바꿔보자.

1. 변수에 object 지정하기

get 혹은 filter를 이용해 앞으로 update할 object를 변수로 지정해준다.

>>> product1 = Product.objects.get(id=1)

변수 지정 주의사항 !!!!

update와 delete를 위해 object를 변수에 지정할때 get에 저장하면 안된다ㅠㅠ 꼭 filter로 id 검색해서 지정하기!

Stackoverflow 답변
The reason for this error is that .get() returns an individual object and .update() only works on querysets, such as what would be returned with .filter() instead of .get().


If you are using .get(), then .update() will not work. You will need to save the information to the object manually:


2. 변수.update

>>> product1.update(description='달달한 딸기에이드')

+) update 명령어를 입력하면 1이 출력된다. 처음엔 이게 변경한 attribute의 수 인줄 알고 그 다음에 name과 description을 모두 바꿔봤는데 그래도 1이 나왔다.


3. table 확인

update 하기 전 table과 같이 비교해보면 다음과 같다.





Ⅴ. Delete

데이터를 삭제한다. 역시 delete 할 object를 변수에 지정해 준뒤 사용한다.


1. 변수.delete()

다음의 명령어를 입력한다.

>>> product1.delete()
(1, {'products.Product': 1})

2. table 확인





🐱 끝

Django의 간단 C.R.U.D 끝~~ 다음은 PK와 FK 활용하기 편!

profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글