Django-DB 연습 #1

채록·2021년 1월 23일
0

Python & Django

목록 보기
8/34
post-thumbnail

여러번 해봐야 손에 익지! 터미널도 꾸며서 이쁘니까.. 오래보자.. 많이보자..



🐶 들어가는 말

  • 가상환경 : wedia17 (Django, mysqlclient 설치 완)
  • directory : MyProjects -> wediya17



I. Startproject

  • startproject => MyProjects의 wediya17 에 들어가 startproject wediya17 .으로 함
django-admin startproject wediya17 .
  • Project name = wediya17
  • 만든 직후 tree 구조



II. 초기 설청

1. vi wediya17/settings.py

manage.py가 있는 main directory에서 바로 wediya17파일 안의 settings.py 를 들어가고 싶으면 /로 이어주면 된다.!

vi wediya17/settings.py

IP 허용

ALLOWED_HOSTS = ['*']

INSTALLED_APPS 비활성 목록

INSTALLED_APPS = [
#   'django.contrib.admin',
#   'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE 비활성 목록

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
 #  'django.middleware.csrf.CsrfViewMiddleware',
 #  'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

2. vi wediya17/urls.py

from django.urls import path

urlpatterns = [
]



III. startapp : products

python manage.py startapp products

settings.py 에 만든 app 추가하기

# vi wediya17/settings.py
INSTALLED_APPS = [
#   'django.contrib.admin',
#   'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'products'
]



IV. mysql에 새 db 추가


1. mysql 실행, 현 db목록 확인

mysql -u root -p
암호입력

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

2. 새 db 생성하기

mysql> create database wediya character set utf8mb4 collate utf8mb4_general_ci;

Query OK, 1 row affected (0.01sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wediya             |
+--------------------+

3. Django에서 db와 연동

# vi wediya17/settings.py
#기존상태
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

#수정후
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.myslq',
        'NAME': 'wediya',
        'USER' : 'root',
        'PASSWORD' : 내비밀번호입력함,
        'HOST' : '127.0.0.1',
        'PORT' : '3306',
    }
}

4. runserver로 연동 확인

python manage.py runserver

진짜 오타 조심 ㅋㅋㅋㅋㅋㅋ


contro+c 로 runerver 종료




V. Table 생성

class 생성 (=db의 table생성)


1. products/models.py

db관리는 models.py!!

vi products/models.py

from django.db import models

# Create your models here.

class Menu(models.Model):
        name = models.CharField(max_length=10)

        class Meta:
                db_table = 'menu'

class Category(models.Model):
        name = models.CharField(max_length=20)
        menu = models.ForeignKey('Menu', on_delete=models.CASCADE)

        class Meta:
                db_table = 'categories'

class Drink(models.Model):
        name = models.CharField(max_length=30)
        category = models.ForeignKey('Category', on_delete=models.CASCADE)

        class Meta:
                db_table = 'drinks'

만든 table

  • menu
  • categories
  • drinks

2. makemigrations

python manage.py makemigrations products

+) showmigrations

makemigrations 된것들 보여줌!
여기서 아직 아무것도 migrate 한게 없기 때문에 체크가 안되있고 만약 migrate 한게 있다면 그건 X 표시가 되어있을 것이다.

3. migrate

1) products 앱 migrate 하기

python manage.py migrate products

이후에 showmigrations으로 확인
캡쳐를 delete까지 하고나서 한거라 이후에 추가한 0002파일도 보임

2) mysql 에서 table 확인

mysql> show tables;
+-------------------+
| Tables_in_wediya  |
+-------------------+
| categories        |
| django_migrations |
| drinks            |
| menu              |
+-------------------+
4 rows in set

+) migrate 하기 전까진 table이 만들어진게 아니다!!!

때문에 암만 models.py 에서 class 만들고 show tables; 해봤자 아무것도 안나온다 (내가 해봐서 더 알게 됨)

mysql> use wediya;
Database changed
mysql> show tables;
Empty set (0.01 sec)

mysql> SELECT * FROM products;
ERROR 1146 (42S02): Table 'wediya.products' doesn't exist
mysql> SELECT * FROM wediya;
ERROR 1146 (42S02): Table 'wediya.wediya' doesn't exist



+) class Drink에 attribute 추가하기

# vi products/models.py
class Drink(models.Model):
        name = models.CharField(max_length=30)
        name_en = models.CharField(max_length=40, null="True")
        category = models.ForeignKey('Category', on_delete=models.CASCADE)


        class Meta:
                db_table = 'drinks'

drinks table에 음료의 영어이름을 추가하기 위해 다음과 같이 name_en 속성을 추가!!

이때, null="True"를 안하고 그냥 makemigrations 했더니라고 뜨면서 Select an option 하라고 뜬다.

Select an option : 2

해서 2를 선택해 나온 후, 다시 models.py 들어가서 null="True"라고 해줬다.
(영어 이름이 없을 수도! 있기때문에 해도 상관없긴 함)

이후 migrate 까지 해줌

근데 여기서.... name_en이 category_id 보다 위에 있게 하고싶어서 models.py 에 순서를 저리 입력했는데 table에서는 그냥 밑에 뜬다ㅠㅠ 그리고 내가 null="True" 를 했기 때문에 Null 에 YEW 라고 뜸!





VI. Create & Read


1. Django shell 시작

python manage.py shell
Python 3.9.1 (default, Dec 11 2020, 06:28:49)
[Clang 10.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

2. 처음 read 상태

아직 아무런 object가 없기 때문에 django 에서 read 하려해도 안뜸.

>>> from products.models import Drink
>>> Drink.objects.all()
<QuerySet []>

3. object 생성 & read 하기

먼저 가장 상위에 있을 menu부터 채웠다.

>>> from products.models import Drink
>>> Drink.objects.all()
<QuerySet []>
>>> from products.models import Menu
>>> Menu.objects.create(name='음료')
<Menu: Menu object (1)>
>>> Menu.objects.create(name='베이커리')
<Menu: Menu object (2)>
>>> Menu.objects.create(name='이디야 스낵')
<Menu: Menu object (3)>
>>> Menu.objects.create(name='MD')
<Menu: Menu object (4)>
>>> Menu.objects.create(name='비니스트')
<Menu: Menu object (5)>
>>> Menu.objects.create(name='원두')
<Menu: Menu object (6)>

이후 read 해봄

>>> Menu.objects.all()
<QuerySet [<Menu: Menu object (1)>, <Menu: Menu object (2)>, <Menu: Menu object (3)>, <Menu: Menu object (4)>, <Menu: Menu object (5)>, <Menu: Menu object (6)>]>

계속 create 진행 ..... 노가다😀

열심히 했다.. 근데 오타 있음!!! Update 로 수정하면될듯

+) FK 값 입력하기

categories table의 경우 카테고리 이름과 속하는 menu 두가지의 column이 있다. 여기서 카테고리 이름(name)은 CharField로 설정했기 때문에 그냥 맞는 이름을 문자열로 입력하면 되고, menu의 경우 class Menu의 pk를 FK로 받기 때문에 INT로 지정해 주었다
그리고 객체를 create 할때 이렇게 입력했다.

Category.objects.create(name='BEVERAGE', menu_id=1)

4. table에서 확인


아... 영어이름 까먹었다... 이것도 update로 입력해줘야지....
영어이름 내용을 입력하지 않았는데도 에러가 나지 않은 이유는 내가 null="True"로 했기 때문이랄까?^ㅠ^....





VII. Update

수정할 것

  • category에서 COFFE 를 COFFEE로
  • null값으로 되어있는 drinks의 영어이름들,,, 전부,,

1) category 수정

대충 변수 ca1 로 지정해줌

>>> from products.models import Category
>>> ca1 = Category.objects.filter(id=1)
>>> ca1.update(name='COFFEE')
1

저 1은 그냥 제대로 수정되었을때 나오는 것인데 models.py에 저 내용을 문자열로 나오도록 설정해주면 내가 바꾼 내역이 나오긴 함.

2) 영어이름 추가(null값에서 수정하는 격)

노가다의 향연 💕우음~^____^

table 확인





VIII. Delete

딱히 지워야 될 데이터는 없지만~ 왠지모르게 맘에안드는 눈꽃 초코빙수 삭제하자

>>> d=Drink.objects.filter(id=13)
>>> d.delete()
(1, {'products.Drink': 1})



🐶 여기까지 Django와 mysql 연동 ~ C.R.U.D 까지 끝!!

최종 table 확인

🐱 앞으로 추가해볼 것

  • 신상여부에 대해 TINYINT 추가
  • 알러지 table과 drinks table을 many to many로 연결하기
profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글