본문 바로가기

Language/PYTHON

django 시작하기 - mariadb 연동 [python3, django 2.0.2]

출처: http://ysmanse.tistory.com/74?category=651369 [킈킈킈!!]


(python3, django 2.0.2 기준)



django 는 기본적으로 sqlite3 를 지원한다. 때문에 MariaDB 를 사용하고 별로도 작업이 좀 필요하다.


MariaDB 는 MySQL기반으로 만들어진 RDS이기 때문에 django 에서 MySQL를 사용할 수 있도록 아래와 같이 pip 을 활용해 mysql 모듈을 설치하여 준다.


> pip install libmysqlclient-dev 


만약 위의 명령어가 에러가 발생한다면


> pip install mysqlclient 


명령으로 설치 한다.



다음으로 내 프로젝트가 데이터베이스에 접근할 수 있또록 프로젝트의 폴더 내 setting.py 를 수정해준다.


DATABASES = {

    'default': {

        #'ENGINE': 'django.db.backends.sqlite3',

        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'db-name',

        'USER': 'db-user-name',

        'PASSWORD': 'db-password',

        'HOST': 'db-adress',

        'PORT': 'port-number'

    }

}



sqlite3 기본 설정되어있는 부분을 주석처리하고 mariadb 사용을 위해 mysql 로 변경해준다.

그 외 name, user, password, host, port 는 자신의 데이터베이스 정보를 알맞게 입력한다.

(host, port 는 빈칸으로 둘수 있는데 기본값은 각각 localhost, 3306 이다.)


이렇게 설정하고 서버를 실행하면 django 에서 알아서 mariadb 연동 준비를 끝낸다.


추가로 django 에서는 사용자 편의를 위해 관리자 기능이나 인증 및 세션 등등의 기능을 제공하는데

db 연동을 하면 해당 기능들을 활성화 시킬 수 있다. 이 기능을 활용하기 위해 django 가 연동한 db 에 초기화를 할 수 있도록

아래와 같이 migration 명령어를 실행해 주자.


> python manage.py migrate 


위 명령이 성공적으로 실행 되었다면 연동된 데이터베이스에 아래와 같은 테이블들이 생성된다.


auth_group

auth_group_permissions

auth_permission

auth_user

auth_user_groups

auth_user_user_permissions

django_admin_log

djang_content_type

django_migrations

django_session


이렇게 모두 생성되었다면 성공적으로 db 연동 준비를 끝낸 것이다.



출처: http://ysmanse.tistory.com/74?category=651369 [킈킈킈!!]








출처 : https://nachwon.github.io/database-mysql/



코드들을 Git 으로 관리하는 경우, 위와 같이 settings.py에 직접 설정들을 입력하면 보안상의 문제가 생길 수 있으므로 별도의 파일에서 설정들을 불러와 입력하도록 하자.

다음은 새로 알게된 별도의 파일에서 설정 정보를 불러오는 방법이다.

cnf 라는 확장자를 가진 파일을 만들고 그 안에 다음과 같이 입력한다. 이름은 mysql.cnf 라고 지어주었다.

# mysql.cnf

[client]
database = DBhost = 데이테베이스 주소(IP)
user = 데이터베이스 계정
password = 계정 비밀번호

그 다음, 위의 파일을 아래와 같이 불러와 적용시켜준다. OPTIONS 라는 항목을 사용한다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': "path/to/mysql.cnf"),
        }
    }
}

STRICT Mode

위 단계까지 진행한 다음 migrate 를 해보면 아래와 같은 경고 메세지가 나타난다.

?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
        HINT: MySQL's Strict Mode fixes many data integrity problems in MySQL, such as data truncation upon insertion, by escalating warnings into errors. It is strongly recommended you activate it. See: 

MySQL 의 Strict Mode 가 설정이 안되어있다는 경고이다.

보통 데이터베이스에 데이터를 입력하는 경우 설정된 필드의 특성에 따라 데이터를 검증하고 검증을 통과하지 못한 경우 데이터의 입력이 되지 않는데, MySQL의 경우 임의적으로 데이터를 변경해서 집어넣는 경우가 있나보다.
예를 들어, MySQL의 CHAR 나 VARCHAR 필드가 가진 글자 수 제한을 넘어서는 데이터가 입력되는 경우 제한된 글자 수 만큼만 데이터가 잘려서 입력된다거나, 어떤 경우에는 -1 을 입력했는데 0이 들어가는 대참사가 일어나기도 한다고 한다.

이를 해결할 수 있는 방법이 바로 Strict Mode 이다.
Strict 모드를 설정하면 올바르지 않은 데이터가 입력되었을 때 오류를 일으키면서 데이터 입력이 되지 않는다.
Strict 모드는 기본적으로 설정되어있지 않으며, MySQL 5.7 버전 부터는 기본적으로 설정되어있다고 한다.

Django 에서 Strict 모드를 설정해주려면 다음과 같이 추가한다.

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': os.path.join(SECRET_DIR, "mysql.cnf"),
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'" # strict mode 설정 추가
        }
    }
}

출처 : https://nachwon.github.io/database-mysql/