앞선 과정을 모두 마쳤으면 MariaDB 에서 정상적인 작업들이 가능할 것입니다. 이제부터 Django 와 연결과 관련한 내용들을 정리해 보겠습니다.


Django 와 Maria DB (MySQL) 연동하기

패키지 설치하기

$ pip install mysqlclient
$ pip install django-mysql (선택)

Maria DB (MySQL) 실행

아래의 스크립트는 root 계정으로 접속한 뒤, 새로운 사용자와 데이터베이스를 생성하고, 추가한 사용자에게 생성한 데이터베이스 권한을 추가하는 내용 입니다.

$ sudo mariadb -u root -p
$ sudo mycli -u root -h localhost mysql  # https://django-mysql.readthedocs.io/en/latest/cache.html
mysql> CREATE DATABASE <테이블이름>;
mysql> CREATE USER '<사용자이름>'@'localhost' IDENTIFIED BY '<비밀번호>';
mysql> GRANT ALL PRIVILEGES ON <테이블이름>.*  to  '<사용자이름>'@'localhost';
mysql> SHOW GRANTS FOR '<사용자이름>'@'localhost';
mysql> FLUSH PRIVILEGES;

Django 와 연결하기

settings.py 설정 파일에서 앞선 설정 내용을 바탕으로 입력을 한 뒤 migration 을 실행하면 됩니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 사용할 DB의 종류
        'NAME': 'DB 이름',
        'USER': 'DB 계정 이름',
        'PASSWORD': 'DB 계정의 패스워드',
        'HOST': '접속 IP',
        'PORT': '포트 번호(3306)',
        'OPTIONS': {
            'charset':'utf8mb4',
            'compress': True,
        }   
    }
}

한글과 같은 문자를 활용하는 경우에는 utf-8 포맷의 DataBase 에서는 오류가 발생합니다. 즉 위의 charset':'utf8mb4 설정값 없이 작업을 진행하면 다음과 같은 오류 메세지를 발생 합니다.

WARNINGS:
?: (django_mysql.W003) The character set is not utf8mb4 for database connection 'default'
        HINT: 'utf8' character set does not include support for all Unicode characters.
        It is strongly recommended you move to use 'utf8mb4'. 
        See: https://django-mysql.readthedocs.io/en/latest/checks.html#django-mysql-w003-utf8mb4

앞의 한글설정 및 포트값 추가 부분을 완료하면 기본값이 utf8mb4 로 적용됩니다. 그럼에도 위의 경고 메세지가 출력되는 경우에는, createsuperuser 등으로 한글을 입력한뒤 정상적으로 처리되는지 또는, DB에 접속해서 default 타입 내용을 확인하면 됩니다.

mysql> SHOW CREATE DATABASE newsite;
+------------------------------------------------------------------------+
| Database | Create Database                                             |
+------------------------------------------------------------------------+
| <DB이름>  | DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ |
+------------------------------------------------------------------------+

compress: True, 설정은 How can I use a compressed connection between Django and MySQL? 의 설정값을 활용한 것으로 응용한 결과, 압축을 하기 이전과 상당히 큰 데이터 크기 차이가 발생 했습니다. 이것은 테이블 생성시 ROW_FORMAT=COMPRESSED 옵션을 추가해주는 설정으로 MySQL 8 이후 버젼부터는 안정적으로 잘 작동합니다.

보다 자세한 내용은 이것이 MySQL 이다 등의 내용을 참고하면, 테이블 압축 기능을 지원하는 방법으로 다음과 같습니다.

CREATE DATABASE IF NOT EXISTS compressDB;
USE compressDB;
CREATE TABLE compressTBL (emp_no int, first_name VARCHAR(14))
    ROW_FORMAT=COMPRESSED ;


추가정보

(2023-01-09) DataError : Out of range value for column 컬럼명

MySQL 에서 발생하는 오류 메세지로, 데이터 타입이 Django 모델 설정과 다를 때 발생하는 오류 입니다. 이번에는 IntegerField() 에서 발생 하는데, 자체적인 해결 방법은 integer 로 입력할 데이터 타입이 int64 로 설정된 내용을, int32 로 변환 후 Migration 작업을 진행 하는 방법으로 해결 했습니다..

import numpy
df['column'] = df['column'].astype(numpy.int32)

(2023-01-12) ID 숫자 초기화 하기

delete() 메서드로 삭제 후, 새로 데이터를 입력하면, 기존의 ID 마지막 숫자에서 부터 작업을 시작 합니다. 새로운 1번부터 인데스를 시작하려면 초기화 설정 을 해야 합니다.

ALTER TABLE `테이블_이름` AUTO_INCREMENT = 1;

InnoDB

MySQL InnoDB 테이블의 압축 조정영문 원본 사이트 등을 참고하면, 데이터 압축과 관련하여 InnoDB설정값 을 통해서 구현 할 수 있다.

Django Project 문서에서도 Django 의 설정 을 통해서 이를 조정할 수 있는데, 우선은 이 부분은 직접 MariaDB 콘솔을 활용하여 설정 및 확인등을 하는 과정을 통해 테스트를 하고, 기본 서비스는 우선 현재 설정내용으로 진행을 하자.

Django RAW SQL

READ 명령을 사용할 때에는 Performing raw SQL queries 의 내용은 데이터를 참조할 때 사용합니다.

for p in Person.objects.raw('SELECT * FROM myapp_person'):
    print(p)

CREATE,UPDATE,DELETE 내용은 Executing custom SQL directly 를 참고하여 다음의 명령을 사용하면 됩니다. ALTER TABLE market_krxpriceohlc AUTO_INCREMENT = 1 와 같이 속성을 변경하는 명령을 사용할 수 있습니다.

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute("ALTER TABLE market_krxpriceohlc AUTO_INCREMENT = 1")
    # row = cursor.fetchone()

참고 사이트