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

Pywiki
둘러보기로 가기 검색하러 가기
 
(같은 사용자의 중간 판 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 연동==
연동드라이버 설치
 
  
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()