"장고 DB설정"의 두 판 사이의 차이
(같은 사용자의 중간 판 7개는 보이지 않습니다) | |||
21번째 줄: | 21번째 줄: | ||
==SQLite== | ==SQLite== | ||
장고 기본 DB. GUI도구인 DB Browser for SQLite를 설치하면 테이블들을 볼 수 있다. | 장고 기본 DB. GUI도구인 DB Browser for SQLite를 설치하면 테이블들을 볼 수 있다. | ||
+ | |||
+ | === 백업 === | ||
+ | 처음엔 SQLite로 개발하다 실제 서비스에서 다른 DB로 넘어가야 할 때가 있다. 그때 기존에 사용하던 데이터를 그대로 옮기고 싶다면 다음의 명령으로 백업파일을 만들자. | ||
+ | |||
+ | <code>python manage.py dumpdata > db.json</code> | ||
+ | |||
==MySQL 연동== | ==MySQL 연동== | ||
− | |||
− | + | === 사전 준비 DB세팅 === | |
+ | 사전에 DB를 만들어두어야 한다. | ||
+ | {| class="wikitable" | ||
+ | !과정 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |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를 만들어주었다면 다음을 진행하자. | ||
+ | {| class="wikitable" | ||
+ | !과정 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |기본 라이브러리 설치 | ||
+ | |아래 과정 중 에러가 나면 이것부터 시작하자. | ||
+ | (보통 도커나 가상환경 등 최소한의 것들만설치되어 있는 환경에서 필요하다.) | ||
+ | |<code>sudo apt-get install python3-dev default-libmysqlclient-dev build-essential</code> | ||
+ | |- | ||
+ | |연동드라이버 설치 | ||
+ | |mysqlclient 설치 | ||
+ | 아래와 같은 에러가 뜨면 위부터 시작하자. | ||
+ | |||
+ | note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed | ||
+ | |pip install mysqlclient | ||
+ | |} | ||
+ | |||
+ | === DB 설정 === | ||
+ | {| class="wikitable" | ||
+ | !과정 | ||
+ | !설명 | ||
+ | !방법 | ||
+ | |- | ||
+ | |연동드라이버 설치 | ||
+ | |mysqlclient 설치 | ||
+ | |pip install mysqlclient | ||
+ | |- | ||
+ | |settings.py 수정 | ||
+ | | | ||
+ | |<syntaxhighlight lang="python"> | ||
+ | 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, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |- | ||
+ | |DB만들기 | ||
+ | |최초의 형태를 만들어준다. | ||
+ | |python manage.py makemigrations | ||
+ | python manage.py migrate | ||
+ | |- | ||
+ | |반영하기 | ||
+ | |이전에 백업한 데이터가 있다면 다음의 명령어를 쓰자. | ||
+ | |||
+ | <code>python manage.py loaddata db.json</code> | ||
+ | |python manage.py migrate | ||
+ | |} | ||
− | + | == MariaDB == | |
+ | mySQL과 완전히 동일하게 진행하면 된다. | ||
+ | |||
+ | 다만, 설정파일 경로가 다르다. mysql은 <code>cd /etc/mysql/mysql.conf.d/</code>인 반면, mariadb는 <code>cd /etc/mysql/mariadb.conf.d/</code> 안에 있다. | ||
+ | |||
+ | === mysql과의 차이 === | ||
+ | {| class="wikitable" | ||
+ | !항목 | ||
+ | !mySQL | ||
+ | !MariaDB | ||
+ | |- | ||
+ | |설정파일 디렉터리 | ||
+ | |<code>/etc/mysql/mysql.conf.d/</code> | ||
+ | |<code>/etc/mysql/mariadb.conf.d/</code> | ||
+ | |- | ||
+ | |사용자 설정 | ||
+ | |client.cnf | ||
+ | |50-client.cnf | ||
+ | |- | ||
+ | | | ||
+ | |마지막 재실행 경로. | ||
+ | |/etc/init.d/mariadb restart | ||
+ | |} | ||
− | |||
− | |||
− | |||
=DB쿼리 사용하기= | =DB쿼리 사용하기= | ||
− | python manage.py dbshell 를 통해 데이터베이스의 쿼리를 | + | python manage.py dbshell 를 통해 데이터베이스의 쿼리를 다룰 수 있다. |
+ | |||
+ | = 관련에러 = | ||
+ | DB관련 에러는 골때린다... 한 번 꼬이면 되돌리기가 너무 힘든데... 왜 이런 것들은 여전히 고전적인지 이해가 잘 되진 않는다. | ||
+ | |||
+ | === utf-8' codec can't decode === | ||
+ | 다양한 방법이 있겠지만... 어이없게 풀렸다. | ||
+ | {| class="wikitable" | ||
+ | !시도 | ||
+ | !설명 | ||
+ | |- | ||
+ | |json 저장 유니코드 변경 | ||
+ | |<code>python manage.py dumpdata > db.json</code>에서 만든 백업파일이 utf-8로 인코딩 되어있지 않은 경우에 먹힌다. | ||
+ | |||
+ | 메모장이든 어떤 것이든 아무 편집기에서 다른 이름으로 저장하여 utf-8로 인코딩 하여 저장한다. | ||
+ | |||
+ | 그리고 이렇게 저장한 파일을 <code>python manage.py loaddata db.json</code>로 풀어내면.. 그간의 노력이 무색하게 된다; | ||
+ | |||
+ | [https://stackoverflow.com/questions/17843630/python-can-dumpdata-cannot-loaddata-back-unicodedecodeerror 링크]를 참조하였다. | ||
+ | |- | ||
+ | |DB기초 설정 | ||
+ | |DB의 인코딩이 utf-8로 되게끔 설정. [https://hongjuzzang.github.io/howto/mysql_django/ 링크]를 참조하자. | ||
+ | |} | ||
+ | |||
+ | === (fields.E300) Field defines a relation with model '***', which is either not installed, or is abstract. === | ||
+ | 다양한 원인인데 다양한 원인인 만큼 다양한 시도가 가능하다. | ||
+ | {| class="wikitable" | ||
+ | !시도 | ||
+ | !설명 | ||
+ | |- | ||
+ | |따옴표 찍기 | ||
+ | |mysql, mariaDB를 이용할 때 발생한 에러이다. | ||
+ | 같은 모델 안에 짠 모델을 참조하려면 아래와 같이 따옴표 안에 두어야 한다. | ||
+ | |||
+ | user = models.ForeignKey('참조모델', on_delete=models.CASCADE) | ||
+ | |||
+ | sqlite에선 따옴표가 없어도 잘 작동하기에, 개발컴퓨터에선 잘 쓰다가 서버컴으로 옮길 때 발생했던 문제이다. | ||
+ | |} | ||
+ | |||
+ | === django.db.utils.IntegrityError: Problem installing fixture ... === | ||
+ | DB를 옮기는 등의 작업에서 처음 만든 DB인데 옮기려 하면 발생하는 에러이다. | ||
+ | {| class="wikitable" | ||
+ | !시도 | ||
+ | !설명 | ||
+ | |- | ||
+ | |장고 쉘에서 코드 실행 | ||
+ | |python manage.py shell로 장고 쉘에 접속해 다음의 두 명령을 진행한 후 다시 시도해보자. | ||
+ | from django.contrib.contenttypes.models import ContentType | ||
+ | |||
+ | ContentType.objects.all().delete() | ||
+ | |} | ||
+ | [[분류:2. 장고 설정]] |
2022년 10월 21일 (금) 11:18 기준 최신판
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() |