TIL - 05/05 django sqlite3 MySQL로 전환하기

Sung Jun Jin·2020년 5월 5일
0

TIL

목록 보기
16/25
post-custom-banner

Django 프로젝트의 기본 데이터베이스는 sqlite3이다. 간단하게 로컬에서 혼자 사용하는 용도로써는 sqlite3도 충분하지만, 여러명이 같이 동시에 작업하는 환경에서는 부적합한 데이터베이스이다. 따라서 팀프로젝트와 같이 웹이 올려놓고 사용하기에는 sqlite3보다 서버 클라이언트 방식의 데이터베이스인 MySQL, PostgreSQL, Oracle 등이 더 적합하다. 여기선 Django 프로젝트의 기본 데이터베이스인 sqlite3를 MySQL로 전환시켜 보겠다.

1. MySQL 접속하기

우선 MySQL 설치 과정은 생략하고 MySQL root 사용자 로그인으로 들어가 데이터베이스 먼저 생성하도록 하겠다.

$ mysql -u root -p 
Enter password : [mysql root 사용자 비밀번호]

추가적으로 show databases 명령어를 사용하면 MySQL에서 생성한 데이터베이스의 목록을 확인할수 있다.

mysql> show databases;

2. 데이터베이스 생성하기

mysql> create database [db 이름] character set utf8mb4 collate utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)

character set은 문자 집합, collate는 정렬을 뜻한다.

  • character set utf8mb4 : mysql에서 기존의 UTF-8 문자 집합을 3 byte의 가변 자료형으로 설계했다. 이후 이모티콘과 같은 4바이트 문자열을 저장하기 위해 가변 4바이트 UTF-8 문자열을 저장할수 있는 자료형을 추가했는데 이것이 바로 utf8mb4이다.

  • collate utf8mb4_general_ci : Collation은 텍스트 데이터를 정렬할때 사용한다. 저장된 텍스트 데이터를 정렬할 경우 어떻게 비교하여 정렬할 것인가를 정해준다. 같은 문자 집합이라도 영어의 경우 대소문자 비교 여부, 우리나라의 가나다라 순서와 일본의 히라가나, 카타카나의 구분 방법등이 달라진다.

3. mysqlclient 설치하기

Python과 MySQL 서버와 통신을 할 수 있게 해주는 데이터베이스 connector인 mysqlclient를 가상환경에 설치해준다.

$ pip install mysqlclient

4. my_settings.py 생성하기

우선 프로젝트 app의 settings.py에서 DATABASES의 값을 변경해줘야 한다

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

django의 프로젝트 app에서 바로 settings.py를 변경해줘도 되지만 설정값을 저장한 파일을 새로 만들어 settings.py에서 간접적으로 import해서 사용할 수 있다. manage.py가 위치한 디렉토리에서 my_settings.py를 생성해준다. 나중에 my_settings.py를 .gitignore에 반드시 추가해준다.

$ vim my_settings.py

settings.py의 DATABASE 부분을 그대로 복사해 다음과 같이 수정해준다.

my_settings.py

DATABASES = {
    'default': {
        'ENGINE'   : 'django.db.backends.mysql',
        'NAME'     : '[db 이름]'),
        'USER'     : 'root',
        'PASSWORD' : '[root 사용자 비밀번호]',
        'HOST'     : '[localHost 또는 127.0.0.1]',
        'OPTIONS'  : {'charset': 'utf8mb4'},
	'TEST': {
	'CHARSET'  : 'utf8mb4',
	'COLLATION': 'utf8_general_ci'
	}
    }
}	

참고를 필자는 우분투 유저이고 HOST 값을 localHost로 지정하고 db 서버를 돌렸을때 socket error가 났었다. localHost를 '127.0.0.1'로 변경해줬더니 오류가 해결됐다.

5. settings.py에서 my_settings.py를 import해 사용하기

프로젝트 app의 settings.py에 들어가 위에서 작성한 my_settings.py를 import 한다

settings.py

Generated by 'django-admin startproject' using Django 3.0.6.

For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""

import os
import my_settings # <------- 이부분!!!

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/

그리고 스크롤을 내리다보면 DATABASES 상수가 보인다. 수정해주자

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = my_settings.DATABASES

앞서 우리가 만들었던 파일은 my_settings.py의 DATABASES 정보가 그대로 들어간다. 이렇게 하고 my_settings.py를 .gitignore에 추가하면 간접적으로 my_settings.py의 설정값을 사용하고 있으므로 git repository에도 데이터베이스 설정값이 노출되지 않는 장점이 있다. 추가적으로 django에서 제공하는 SECRET_KEY도 위와 같은 방법으로 세팅해주면 된다.

6. python manage.py runserver

서버를 한번 돌려 미쳐 확인못한 오타들을 잡아준다. 이후 models를 설계하고 migrate한 뒤 mysql로 들어가 migration 여부를 확인해준다.

profile
주니어 개발쟈🤦‍♂️
post-custom-banner

0개의 댓글