[django] [mysql] mysql 연동

DanChu 🌟·2021년 1월 30일
0

데이터베이스 생성

django 와 연결 될 db를 생성한다. 참고로 mysql은 이미 설치 된 적 있다면 가상환경 상관없이 어디서든 접속 가능 (pip가 아닌 brew로 설치했기때문에)

mysql.server start

SUCCESS! 란 문구가 뜨면 mysql 서버 실행 성공.

mysql -u root -p

-u: mysql에 접속할 사용자의 아이디
-p: 비밀번호를 직접 입력하겠다고 명시하는 옵션
이후에 비밀번호 입력하는 창에서는 mysql설치 당시 설정했던 비밀번호 입력 후 엔터!

새로운 database를 생성하려면:

create database [db이름] character set utf8mb4 collate utf8mb4_general_ci;

mysql은 프로젝트별 가상공간을 만들지 않기 때문에 여러개의 database가 존재할 수 있다.

현재 생성된 databases를 확인하려면:

show databases;

특정 database 선택시:

use [database 이름];

database 안의 테이블 확인시:

show tables;

작업환경과 db 연동하기

settings.py

db를 생성했으니 django와 연동을 시켜야한다.
terminal 에서 settings.py에 환경설정 정보들이 있으므로 settings.py를 연다.

[프로젝트 이름]/[프로젝트 이름] 폴더에서 실제 작업환경은 두번째 폴더이므로 해당 폴더로 이동.

cd [프로젝트 이름]

settings.py 파일은 vs code나 기타 에디터에서 수정할 수도 있지만 여기서는 아래의 명령어로 실행.

vi settings.py

스크롤을 내리다보면 DATABASES 라는 섹션이 나오는데, 연결하고싶은 db의 정보를 입력하고 :wq로 저장후 exit.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.**mysql**',
        'NAME': 'db이름',
        'USER': 'root',
        'PASSWORD': 'mysql 비밀번호',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

중요정보 파일 분할해서 관리하기 (my_settings.py)

settings.py 파일에 담긴 secret key 와 db 정보는 중요한 정보이므로 추후 github에 push 전에 반드시 처리해주어야 한다.

manage.py가 있는 directory 에서 아래와 같은 my_settings.py 파일을 생성.

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '[db이름]',
        'USER': 'root',
        'PASSWORD': '[db 비밀번호]',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

SECRET = '[secret_key]'

이후 settings.py에는 아래와 같이 변경.

import my_settings.py
.
.
DATABASES = my_settings.DATABASES
SECRET_KEY =  my_settings.SECRET

마지막으로 my_settings.py 파일이 있는 directory 에서 .gitignore을 생성하는데, 여기 를 이용하면 파일 생성이 편리하다.

해당 파일 복붙시 마지막에

my_settings.py
*.csv

를 추가하면 끝!


개인적 용도)
settings.py 파일에 추가 수정사항:

admin import 를 취소했기때문에
[프로젝트 이름]/urls.py 파일도 수정이 필요하다


migration

settings.py에 db정보가 입력이 되었다면 migration을 꼭 거쳐야 연동이 완료된다.

settings.py가 있는 level 이 아닌 한단계 위, manage.py 가 있는 level 로 이동!

python manage.py makemigrations

migrate하기에 문제가 있다면 (e.g.코드에러 등) 에러메세지를 띄워존다.

python manage.py migrate

위의 두 명령어를 실행한 뒤에야 django와 db의 연결이 완료된다.

c.f. makemigration vs. migrate


CRUD

한 프로젝트 안에서 각 기능별 구현은 app 이라는 하위 항목을 만들어 관리한다.
c.f. [프로젝트 이름] 폴더에는 프로젝트가 실행되기 위한 것들은 저장하는 곳

python manage.py startapp [app 이름]

반드시 manage.py 파일이 존재하는 곳에서 startapp 실행!

urls.py, views.py, models.py를 실제로 개발시 많이 접근하게되는데, 이 중 models.py 와 views.py는 각 앱 폴더 안에 존재한다.

이렇게 만들어진 새로운 앱은 아직 django에서 인식이 되지 않는다. 그러므로 아래 파일에 다시 들어가서 INSTALLED_APPS 안에 추가된 항목을 기입해주어야 한다 ('[app 이름]'). 이후 :qw 로 저장&종료.

vi [프로젝트 이름]/settings.py

db structure

models.py

models.py 안의 클래스 선언이 곧 db에서의 테이블을 규정하는 것이다.

vi [app 이름]/models.py

예)

from django.db import models

class [앱이름(Account)](models.Model):
	name = models.CharField(max_length=50)
	create_at = models.DataTimeField(auto_now=True)

	class Meta:
		db_table='[앱 이름]'

class Meta

inner class로 사용(indent)해서 상위 class에게 meta data를 제공.
e.g.

- ordering = ['-number', 'price']  
	:number field 내림차순, price 오름차순
    
- abstract = True
	:이 클래스는 추상클래스의 베이스가 될 것
    
- verbose_name
	:사용자가 읽기 쉬운 객체의 이름으로 관리자 화면에서 표시 
	미지정시 CamelCase => camel case
    
- verbose_name_plural

- db_table
	: 모델에서 사용하기 위한 데이터베이스 테이블의 이름
    

migration

처음 db를 django와 연동할때도 migration 단계를 거쳤듯, models.py를 작성했으면 다시 migration 이 필요.

python manage.py makemigrations [앱 이름]

Migrations for 'account':
	account/migrations/0001_initial.py
		-Create model **Account**

makemigration은 models.py에서 만든 각 class를 db테이블을 만드는 sql command로 만들어주는 프로세스. 이 과정에서 models.py가 문제없이 잘 작성이 잘 됐는지 검사됨.
성공시, [앱 이름]폴더 안에 migrations안에 0001_initial.py가 생성

0001_initial.py 장고가 데이터 베이스에서 어떤 작업을 했는지에 대한 설계도/계획표.
현재 db의 상태를 장고에게 알려줄 수 있는 파일.

python manage.py migrate```

로 migrate시 db에 테이블 생성 완료.

shell

django에서는 만든 db를 바로 실행해볼 수 있는 환경이 제공:

python manage.py shell

python으로 shell을 열면 그냥 터미널에서 shell여는 것과 달리 django가 이미 import 되어있음

shell에서 crud

db의 accounts 테이블 불러옴
(models.py에서 class Account(예시)로 선언한 모델)

from [앱이름].models import [모델의 클래스 (Account)]

accounts 테이블에서 전체 objects 불러오기:

[클래스 이름](Account).objects.all()

accounts테이블의 모든 항목을 선택:
SQL server에서

SELECT * FROM accounts;

참고)
Account 는 models 에서 선언된 class 명.
즉, Account 는 객채화 하는 모델, Account 안에는 객채화 된 상태의 데이터.

models.py에서 Account라는 class에 db_table = accounts라는 Meta 클래스를 주었기 때문에 Account 와 accounts의 혼동을 주의해야한다!

데이터 추가하기:

[class 이름].objects.create(name='이단비')

db에서 불러오기

Account.objects.get(name='이단비')

variable에 데이터 담기

a = Account.objects.get(name='이단비')

variable에는 db의 값이 copy & paste되어 들어오는 것이 아닌, db가 저장되어있는 메모리의 주소가 variable에 할당되는 것.
즉, variable은 db 데이터 위치의 shortcut 같은 개념.

따라서 variable에 value를 수정하는 것으로 db의 original 데이터 수정이 일어남.

cf. 파이썬에서:
list_alpha = [1, 2, 3, 4, 5]
a = list_alpha[0]
a = 3
list_alpha[0] 은 3이 아닌 그대로 1 

variable 불러오기:

a

결과값

<Account: Account object (1)>

데이터 수정하기:

a.name = '단탱이'

이 상태에서는 아직 db에 새로운 값으로 저장은 안되어있음.

a.save()

로 저장까지 해 주어야 db에 업데이트됨!

SQL server 에서

SELECT * FROM accounts;

로 확인 가능 (update 명령어도 있음, update는 filter로 query set에서만 가능)

삭제

a.delete()

순서 정리:

  1. 가상환경 만들기
  2. 장고 설치
  3. 장고 프로젝트 생성
  4. 서버 잘 실행되는지 확인:
	python manage.py runserver 
  1. python manage.py migrate


참고) 

python manage.py createsuperuser

admin 계정 생성 (서버실행할때 위치하는 directory 에서 실행)
-> 장고 웹서버에서 /admin 입력시 어드민 페이지 활성화















0개의 댓글