수학과의 좌충우돌 프로그래밍

[Django] Django 2.2 mysql 8 버전 연동하기 본문

웹프로그래밍/Django

[Django] Django 2.2 mysql 8 버전 연동하기

ssung.k 2020. 8. 2. 04:36

여러 개의 프로젝트를 각각 다른 버전으로 진행하다보니 버전간의 호환성 문제가 생각보다 골칫거리였습니다.

django는 LTS를 고려하여 2.2 버전을 선정하였고 mysql은 RDS를 사용하고 있는데 default로 선정되는 8점대 버전을 사용하였습니다.

기존에 사용하던 DB connection 라이브러리들이 정상적으로 작동하지 않았고 많은 분들이 같은 어려움을 겪을거 같아 글을 남기려 합니다.

 

PyMySQL

PyMySQL==0.10.0

 

PyMySQL 을 사용하여 db을 연결하는 방법은 다음과 같습니다.

import pymysql

pymysql.install_as_MySQLdb()

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'admin',
        'PASSWORD': 'qwe123',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

 

하지만 다음과 같은 오류가 발생합니다.

AttributeError: 'str' object has no attribute 'decode'

 

기존 python2에서는 string 타입에 대해 decode() 함수가 존재하였지만 python3에서 부터는 기본적으로 utf-8이기 때문에 string 타입이 decode()를 지원하지 않습니다. 이로서 발생한 에러입니다.

코드를 추적해보니 다음과 같은 구문이 있었고 아래와 같이 수정하니 문제 없이 동작하였습니다.

query = query.decode(errors='replace')
query = errors='replace'

 

하지만 django의 고유코드를 건드리는건 지양하고, 해당 클래스를 상속받고 오버라이딩 할 순 있었지만 더 좋은 방법을 찾고 싶었습니다.

 

mysqlclient

mysqlclient==2.0.1

 

mysqlclient를 사용해서 DB를 연결하는 방법은 다음과 같습니다.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'admin',
        'PASSWORD': 'qwe123',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

 

하지만 다음과 같은 오류가 발생하고 _mysql 이 존재하지 않아 발생하는 문제였습니다.

NameError: name '_mysql' is not defined

 

mysql-connector-python

mysql-connector-python==8.0.21

 

mysql-connector-python 를 통해 해결하였습니다.

mysql-connector-python 는 다음과 같이 DB와 연동합니다.

DATABASES = {
    'default': {
        'ENGINE': 'mysql.connector.django',
        'NAME': 'proom',
        'USER': 'admin',
        'PASSWORD': 'mskang0710!',
        'HOST': 'proom.cfucbe4phk9c.ap-northeast-2.rds.amazonaws.com',
        'PORT': '3306',
    }
}

 

Comments