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. 장고 설정]] |