django mysql db 연동 및 숙제(의미보다 손기억)

홍태경·2021년 3월 25일
0

1. mysql 접근 및 데이터베이스 생성

sudo apt-get install -y mysql

sudo apt-get install python3.9-dev

둘의 차이를 모르겠다.

sudo apt-get install libmysqlclient-dev

sudo apt-get install -y mysql-server mysqlclient

sudo mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.23-0ubuntu0.20.04.1 (Ubuntu)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

mysql> create database django_insta
character set utf8mb4 collate utf8mb4_general_ci;

Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| django_insta |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)

mysql> use django_insta
use django_insta

Database changed

mysql> show tables;
Empty set (0.01 sec)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

FLUSH PRIVILEGES는 grant 테이블을 reload함으로서 변경 사항을 즉시 반영

가상환경에서 mysqlclient 설치

로컬서버에 있는 mysql을 가상환경에서 접근하기 위해서는 mysqlclient가 필요하다
install python3.9-dev 무조건 설치

sudo apt-get install python3.9-dev

(first) ubuntu@ubuntu:~/miniconda3$ pip install mysqlclient Collecting mysqlclient
Using cached mysqlclient-2.0.3.tar.gz (88 kB)
Building wheels for collected packages: mysqlclient
Building wheel for mysqlclient (setup.py) ... done
Created wheel for mysqlclient: filename=mysqlclient-2.0.3-cp39-cp39-linux_x86_64.whl size=60849 sha256=607571aaa7fd17f461981d700a3c8ec2662773a007fe241a112785595a438255
Stored in directory: /home/ubuntu/.cache/pip/wheels/43/55/d9/a2243d4b624c18c5cba30bf88e0521147498368068cb302532
Successfully built mysqlclient
Installing collected packages: mysqlclient
Successfully installed mysqlclient-2.0.3

app > models.py 수정 ( 의미는 일단 나중에 파악)

from django.db import models

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

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

class drink(models.Model):
name = models.CharField(max_length=20)

            menu = models.ForeignKey('Menu',on_delete=models.CASCADE)
            category = models.ForeignKey('Category',on_delete=models.CASCADE)

my_settings.py를 생성 (이유는 잘 모름)

vim my_settings.py
DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_insta',
'USER': 'root',
'PASSWORD': 'ubuntu',
'HOST': 'localhost',
'PORT': '3306',
}
}
SECRET = {
'secret':'=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
}

장고에 mysql 연동 후 컬럼 생성하기

새로운 mysql 파일 생성 및 경로

(first) ubuntu@ip-172-31-2-0:~/miniconda3/mysite1$ vim my_settings.py

(first) ubuntu@ubuntu:~/miniconda3/mysite$ ll
total 24
drwxrwxr-x 4 ubuntu ubuntu 4096 Mar 28 14:44 ./
drwxrwxr-x 18 ubuntu ubuntu 4096 Mar 28 14:04 ../
-rwxrwxr-x 1 ubuntu ubuntu 662 Mar 28 14:04 manage.py*
-rw-rw-r-- 1 ubuntu ubuntu 309 Mar 28 14:44 my_settings.py
drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 28 14:24 mysite/
drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 28 14:19 products/

DATABASES = {
'default' : {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_insta', # 데이터베이스 이름 수정
'USER': 'root',
'PASSWORD': 'ubuntu', # 패스워드 수정
'HOST': 'localhost',
'PORT': '3306',
}
}

SECRET = {
'secret':'시크릿키(꽤 김 ) ',
}

이것을 장고 settings에 import 시켜줘야한다

기존 장고 셋팅 db 부분

SECRET_KEY = '@7jtsz9k#9wreaybq0()dbu#8f9=zca-b((^%x!f@l+-x6zy'

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}

수정 후
**

23번, 82번 14번 수정

14 import my_settings ( 추가)

23 SECRET_KEY = my_settings.SECRET['secret']

82 DATABASES = my_settings.DATABASES

db 마이그레이션

$ python manage.py makemigrations products/

No installed app with label 'products/'.

./manage.py makemigrations
./manage.py migrate

python manage.py shell

from products.models import Menu, Category

2주차 주말 숙제 mysql table에 스타벅스 컬럼 추가하기

  1. models.py 에 컬럼 제목 추가
  2. shell에서 컬럼 추가
  3. mysql에서 확인

숙제

1.models.py 에 컬럼 제목 추가

from django.db import models

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

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

class Drink(models.Model):
korean_name = models.CharField(max_length=100)
english_name = models.CharField(max_length=100)
category = models.ForeignKey('Category',on_delete=models.CASCADE)
descripthon = models.TextField()

class Allergy(models.Model):
name = models.CharField(max_length=20)
drink = models.ManyToManyField('Drink')

class Allergy_drink(models.Model):
allergy = models.ForeignKey('Allergy',on_delete=models.CASCADE)
drink = models.ForeignKey('Drink',on_delete=models.CASCADE)

class Nutrition(models.Model):
one_serving_kca = models.DecimalField(max_digits = 5, decimal_places = 2)
sodium_mg = models.DecimalField(max_digits = 5, decimal_places = 2)
saturated_fat_g = models.DecimalField(max_digits = 5, decimal_places = 2)
sugars_g = models.DecimalField(max_digits = 5, decimal_places = 2)
protein_g = models.DecimalField(max_digits = 5, decimal_places = 2)
caffeine_mg = models.DecimalField(max_digits = 5, decimal_places = 2)
drink = models.ForeignKey('Drink',on_delete=models.CASCADE)
size_mi = models.CharField(max_length=20)
size_fluid_ounce = models.CharField(max_length=20)

class Image(models.Model):
image_url = models.CharField(max_length=500)
drink = models.Foreignkey('Drink',on_delete=models.CASCADE)

module 'django.db.models' has no attribute 'Foreignkey'

(first) ubuntu@ubuntu:~/miniconda3/mysite$ ./manage.py makemigrations
Migrations for 'products':
products/migrations/0003_allergy_allergydrink.py
- Create model allergy
- Create model allergydrink
(first) ubuntu@ubuntu:~/miniconda3/mysite$ ./manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, products, sessions
Running migrations:
Applying products.0003_allergy_allergydrink... OK

2. shell에서 컬럼 추가

from product.models import Menu, Category, drink, allergy, allergydrink

방법1. 등록 후 자동 저장

Menu.objects.create(name="음료");
Menu.objects.create(name="푸드");

방법2. 등록 후 수동 저장

a1 = Menu(name="상품")
a2 = Menu(name="카드")
a1.save()
a2.save()

2번 시작
Menu.objects.create(name="음료");
Menu.objects.create(name="푸드");
Menu.objects.create(name="상품");
Menu.objects.create(name="카드");

3. mysql에서 확인

mysql> show tables
-> ;
+----------------------------+
| Tables_in_django_insta |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
| products_category |
| products_menu |
| products_product |
+----------------------------+

mysql> select * from products_menu
-> ;
+----+--------+
| id | name |
+----+--------+
| 1 | 음료 |
| 2 | 푸드 |
| 3 | 상품 |
| 4 | 카드 |
+----+--------+

공부할 점 = db에서 객체와 벨류의 차이는 아직 모르겠다이는 아직 모르겠다

profile
나의 에고를 인정하고 사랑하자

0개의 댓글