장고 DB설정
1 개요[편집 | 원본 편집]
모델에 의해 관리되는 데이터베이스.
기본 설치는 SQLite로 되어있다.
그러나, 동시접근처리능력에서 약해 엔터프라이즈급 DB를 사용해야 할 때가 있다.
1.1 공식지원 DB[편집 | 원본 편집]
MySQL(Maria DB), PostgreSQL, Oracle DB를 공식적으로 지원하고 있다.
2 연동[편집 | 원본 편집]
기본적인 절차는 다음과 같다.
- 연동드라이버 설치
- settings.py 수정
- DB반영
- python manage.py migrate
- 재설정
- 처음 만든 DB는 초기화 상태. 관리자계정 생성 등 이런저런 설정을 다시 해주어야 한다.
2.1 설정[편집 | 원본 편집]
데이터베이스 관련 설정에서 ENGINE을 수정하여 기본 DB를 설정할 수 있다.
기본적으로 django.db.backends.sqlite3
라고 되어있지만, django.db.backends.postgresql
,django.db.backends.mysql
,django.db.backends.oracle
까지 4가지를 공식 지원한다.
2.2 SQLite[편집 | 원본 편집]
장고 기본 DB. GUI도구인 DB Browser for SQLite를 설치하면 테이블들을 볼 수 있다.
2.2.1 백업[편집 | 원본 편집]
처음엔 SQLite로 개발하다 실제 서비스에서 다른 DB로 넘어가야 할 때가 있다. 그때 기존에 사용하던 데이터를 그대로 옮기고 싶다면 다음의 명령으로 백업파일을 만들자.
python manage.py dumpdata > db.json
2.3 MySQL 연동[편집 | 원본 편집]
2.3.1 사전 준비 DB세팅[편집 | 원본 편집]
사전에 DB를 만들어두어야 한다.
과정 | 설명 | 방법 |
---|---|---|
mysql 접속 | 다음과 같은 방법으로 접속한다. | sudo mysql -u root -p |
유저 생성 | DB를 사용할 유저를 생성한다. | CREATE USER '유저이름'@'localhost' IDENTIFIED BY '비밀번호'; |
DB생성 | CREATE DATABASE mysite | |
유저 권한부여 | 유저가 DB를 사용할 수 있는 권한을 부여한다. | use mysite;
GRANT ALL ON coin_minute_info.* TO '유저이름'@'localhost'; |
DB를 만들어주었다면 다음을 진행하자.
과정 | 설명 | 방법 |
---|---|---|
기본 라이브러리 설치 | 아래 과정 중 에러가 나면 이것부터 시작하자.
(보통 도커나 가상환경 등 최소한의 것들만설치되어 있는 환경에서 필요하다.) |
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
|
연동드라이버 설치 | mysqlclient 설치
아래와 같은 에러가 뜨면 위부터 시작하자. note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed |
pip install mysqlclient |
2.3.2 DB 설정[편집 | 원본 편집]
과정 | 설명 | 방법 |
---|---|---|
연동드라이버 설치 | mysqlclient 설치 | pip install mysqlclient |
settings.py 수정 | DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'USER': 'user',
'PASSWORD': '1234',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
'charset': 'utf8mb4', # 테이블 생성할 때 유니코드 지정.(한국어 표현을 위해.)
'use_unicode': True,
}
}
}
| |
DB만들기 | 최초의 형태를 만들어준다. | python manage.py makemigrations
python manage.py migrate |
반영하기 | 이전에 백업한 데이터가 있다면 다음의 명령어를 쓰자.
|
python manage.py migrate |
2.4 MariaDB[편집 | 원본 편집]
mySQL과 완전히 동일하게 진행하면 된다.
다만, 설정파일 경로가 다르다. mysql은 cd /etc/mysql/mysql.conf.d/
인 반면, mariadb는 cd /etc/mysql/mariadb.conf.d/
안에 있다.
2.4.1 mysql과의 차이[편집 | 원본 편집]
항목 | mySQL | MariaDB |
---|---|---|
설정파일 디렉터리 | /etc/mysql/mysql.conf.d/
|
/etc/mysql/mariadb.conf.d/
|
사용자 설정 | client.cnf | 50-client.cnf |
마지막 재실행 경로. | /etc/init.d/mariadb restart |
3 DB쿼리 사용하기[편집 | 원본 편집]
python manage.py dbshell 를 통해 데이터베이스의 쿼리를 다룰 수 있다.
4 관련에러[편집 | 원본 편집]
DB관련 에러는 골때린다... 한 번 꼬이면 되돌리기가 너무 힘든데... 왜 이런 것들은 여전히 고전적인지 이해가 잘 되진 않는다.
4.1 utf-8' codec can't decode[편집 | 원본 편집]
다양한 방법이 있겠지만... 어이없게 풀렸다.
시도 | 설명 |
---|---|
json 저장 유니코드 변경 | python manage.py dumpdata > db.json 에서 만든 백업파일이 utf-8로 인코딩 되어있지 않은 경우에 먹힌다.
메모장이든 어떤 것이든 아무 편집기에서 다른 이름으로 저장하여 utf-8로 인코딩 하여 저장한다. 그리고 이렇게 저장한 파일을 링크를 참조하였다. |
DB기초 설정 | DB의 인코딩이 utf-8로 되게끔 설정. 링크를 참조하자. |
4.2 (fields.E300) Field defines a relation with model '***', which is either not installed, or is abstract.[편집 | 원본 편집]
다양한 원인인데 다양한 원인인 만큼 다양한 시도가 가능하다.
시도 | 설명 |
---|---|
따옴표 찍기 | mysql, mariaDB를 이용할 때 발생한 에러이다.
같은 모델 안에 짠 모델을 참조하려면 아래와 같이 따옴표 안에 두어야 한다. user = models.ForeignKey('참조모델', on_delete=models.CASCADE) sqlite에선 따옴표가 없어도 잘 작동하기에, 개발컴퓨터에선 잘 쓰다가 서버컴으로 옮길 때 발생했던 문제이다. |
4.3 django.db.utils.IntegrityError: Problem installing fixture ...[편집 | 원본 편집]
DB를 옮기는 등의 작업에서 처음 만든 DB인데 옮기려 하면 발생하는 에러이다.
시도 | 설명 |
---|---|
장고 쉘에서 코드 실행 | python manage.py shell로 장고 쉘에 접속해 다음의 두 명령을 진행한 후 다시 시도해보자.
from django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete() |