"장고 DB설정"의 두 판 사이의 차이

(새 문서: ==개요== 모델에 의해 관리되는 데이터베이스. 기본 설치는 SQLite로 되어있다. 그러나, 동시접근처리능력에서 약해 엔터프라이즈급 DB를...)
 
 
(같은 사용자의 중간 판 8개는 보이지 않습니다)
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 연동==
연동드라이버 설치
 
  
mysqlclient를 설치한다.
+
=== 사전 준비 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
 +
|}
  
settings.py 수정
+
== 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
 +
|}
  
DATABASES항목의 내용을 변경해야 한다. 자세한 부분은 파이썬 웹프로그래밍 p.334
 
  
반영하기
 
  
python manage.py migrate
 
 
=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 연동편집

기본적인 절차는 다음과 같다.

  1. 연동드라이버 설치
  2. settings.py 수정
  3. DB반영
    python manage.py migrate
  4. 재설정
    처음 만든 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 loaddata db.json

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로 인코딩 하여 저장한다.

그리고 이렇게 저장한 파일을 python manage.py loaddata db.json로 풀어내면.. 그간의 노력이 무색하게 된다;

링크를 참조하였다.

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()