표(table) 하나가 class 하나
makemigrations 실행하고 난 뒤,
각 앱 안에 migrations 라는 디렉터리 안에 명령어들이 전부 들어있음
여기서는 products 앱 안에 migrations 라는 디렉터리 안에 들어있음
cd products
products 디렉터리로 이동
ls
__init__.py __pycache__ admin.py apps.py
migrations models.py tests.py views.py
migrations 라는 디렉터리가 생김
cd migrations
migrations 디렉터리로 이동
ls
디렉터리 안에 뭐뭐 있는지 보기
0001_initial.py __init__.py __pycache__
makemigrations 해서 0001_initial.py 생김
vi 0001_initial.py
0001_initial.py 파일 들어가서 보면 업데이트 된 내용 들어 있음
..
products 디렉터리로 이동
vi models.py
models.py에서 price 속성 추가
class Product(models.Model):
name = models.CharField(max_length=50)
description = models.CharField(max_length=1000)
price = models.CharField(max_length=1000, null=True) # price 추가
class Meta:
db_table = 'products'
..
manage.py가 있는 첫 번째 westarbucks17 디렉터리로 이동
python manage.py makemigrations products
price 속성 추가한 거 반영하기 위해 migration
Migrations for 'products':
products/migrations/0002_product_price.py
- Add field price to product
0002_product_price.py 파일 생김
0002_product_price.py 파일에는 오로지 price에 대한 내용만 있음(업데이트 된 내용만 들어있음)
python manage.py migrate products
migrate도 해주기
Operations to perform:
Apply all migrations: products
Running migrations:
Applying products.0002_product_price... OK
0002_product_price 파일 적용됨
cd products
products 디렉터리로 이동
cd migrations
migrations 디렉터리로 이동
ls
migrations 디렉터리에 있는 거 보기
0001_initial.py 0002_product_price.py __init__.py __pycache__
0002_product_price.py 파일 생긴 게 보임
vi 0002_product_price.py
price에 대한 내용만 들어있음
migrations.AddField 라고 써있음
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('products', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='product',
name='price',
field=models.CharField(max_length=1000, null=True),
),
]
..
..
manage.py 있는 위치로 이동하기
./manage.py shell
장고 쉘 실행
Python 3.7.9 (default, Aug 31 2020, 07:22:35)
[Clang 10.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from products.models import Product
products 패키지에 있는 models라는 모듈에서 Product 클래스를 import
>>> Product.objects.all()
Product 클래스 안에 있는 모든 객체(인스턴스/row)를 다 가져오는 명령어
row 하나가 인스턴스 하나
클래스에 있는 인스턴스 하나가 테이블에 있는 행(row) 하나
<QuerySet []>
빈 리스트 나옴
※ QuerySet: 장고에서 만든 클래스의 인스턴스. 객체들이 모여 있는 리스트.
리스트에서 사용할 수 있는 인덱싱, 슬라이싱, 반복문 사용 가능
단, 인덱싱 [-1]은 안 됨
이게 C.R.U.D 중에서 R(Read)에 해당하는 것
>>> Product.objects.create(name='볼펜', description='모나미에서 만든 펜', price='$1000')
>>> Product.objects.create(name='볼펜', description='모나미에서 만든 펜', price='$1000')
<Product: Product object (1)>
Product 클래스에 1번 객체가 생겼다고 뜸
mysql> show databases;
mysql에서 명령어 입력하기
데이터베이스 목록 보여줌
mysql> use westarbucks
mysql> use westarbucks
Database changed
mysql에서 명령어 입력하기
westarbucks 데이터베이스를 사용하겠다
mysql> show tables;
Empty set (0.00 sec)
mysql> SELECT * FROM products;
mysql에서 명령어 입력하기
mysql> SELECT * FROM products;
+----+--------+----------------------------+-------+
| id | name | description | price |
+----+--------+----------------------------+-------+
| 1 | 볼펜 | 모나미에서 만든 펜 | $1000 |
+----+--------+----------------------------+-------+
1 row in set (0.00 sec)
>>> Product.objects.create(name='컵', description='스타벅스에서 만든 컵', price='$1300')
장고 쉘에서 명령어 입력하기
>>> Product.objects.create(name='컵', description='스타벅스에서 만든 컵', price='$1300')
<Product: Product object (2)>
mysql> SELECT * FROM products;
mysql에서 명령어 입력하기
mysql> SELECT * FROM products;
+----+--------+-------------------------------+-------+
| id | name | description | price |
+----+--------+-------------------------------+-------+
| 1 | 볼펜 | 모나미에서 만든 펜 | $1000 |
| 2 | 컵 | 스타벅스에서 만든 컵 | $1300 |
+----+--------+-------------------------------+-------+
2 rows in set (0.00 sec)
>>> Product.objects.create(name='텀블러', description='스타벅스에서 만든 텀블러', price='$1500')
장고 쉘에서 명령어 입력하기
>>> Product.objects.create(name='텀블러', description='스타벅스에서 만든 텀블러', price='$1500')
<Product: Product object (3)>
mysql> SELECT * FROM products;
mysql> SELECT * FROM products;
+----+-----------+-------------------------------------+-------+
| id | name | description | price |
+----+-----------+-------------------------------------+-------+
| 1 | 볼펜 | 모나미에서 만든 펜 | $1000 |
| 2 | 컵 | 스타벅스에서 만든 컵 | $1300 |
| 3 | 텀블러 | 스타벅스에서 만든 텀블러 | $1500 |
+----+-----------+-------------------------------------+-------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM products \G
맨 끝에 \G
입력하면 그냥 목록으로 볼 수 있음
mysql> SELECT * FROM products \G
*************************** 1. row ***************************
id: 1
name: 볼펜
description: 모나미에서 만든 펜
price: $1000
*************************** 2. row ***************************
id: 2
name: 컵
description: 스타벅스에서 만든 컵
price: $1300
*************************** 3. row ***************************
id: 3
name: 텀블러
description: 스타벅스에서 만든 텀블러
price: $1500
3 rows in set (0.00 sec)
>>> Product.objects.all()
장고 쉘에서 입력
>>> Product.objects.all()
<QuerySet [<Product: Product object (1)>, <Product: Product object (2)>, <Product: Product object (3)>]>
※ QuerySet: 장고에서 만든 클래스의 인스턴스. 객체들이 모여 있는 리스트.
리스트에서 사용할 수 있는 인덱싱, 슬라이싱, 반복문 사용 가능
단, 인덱싱 [-1]은 안 됨
>>> Product.objects.get(id=1)
get으로 불러오면 객체로 반환함
>>> Product.objects.get(id=1)
<Product: Product object (1)>
>>> Product.objects.filter(id=1)
filter로 불러오면 QuerySet으로 반환함
>>> Product.objects.filter(id=1)
<QuerySet [<Product: Product object (1)>]>
>>> product1 = Product.objects.filter(id=1)
변수 생성
>>> product1
product1 확인해보기
>>> product1
<QuerySet [<Product: Product object (1)>]>
>>> product1[0].name
리스트(QuerySet)의 첫 번째 요소니까 [0] (파이썬은 0부터 시작)
>>> product1[0].name
'볼펜'
>>> product1.update(name='검정색볼펜')
name을 볼펜에서 검정색볼펜으로 변경
>>> product1.update(name='검정색볼펜')
1
>>> product1[0].name
name 잘 바뀌었는지 확인
>>> product1[0].name
'검정색볼펜'
>>> product1.delete()
product1 삭제
>>> product1.delete()
(1, {'products.Product': 1})
mysql> SELECT * FROM products;
삭제됐는지 확인하기
mysql> SELECT * FROM products;
+----+-----------+-------------------------------------+-------+
| id | name | description | price |
+----+-----------+-------------------------------------+-------+
| 2 | 컵 | 스타벅스에서 만든 컵 | $1300 |
| 3 | 텀블러 | 스타벅스에서 만든 텀블러 | $1500 |
+----+-----------+-------------------------------------+-------+
2 rows in set (0.00 sec)