본문 바로가기

프로그래밍/PYTHON

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module

django에서 제공하는 MySql 연동 드라이버 모듈은 3가지가 존재합니다.

1. MySQLdb - 제일 안정된 드라이버, python3은 지원하지 않습니다.
2. Mysqlclient - MySQLdb를 개선한 패키지, Python3.3 이상의 버전도 지원하고있음, 장고에서 추천합니다.
3. MySQL Connector/Python - MySQL 개발사 오라클에서 제공하는 드라이버 입니다.

하지만 간단히 사용하기가 수월치 않습니다.

PS C:\Python34\djangno-sample\todoSubject> python manage.py runserver
Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\backends\mysql\base.py", line 16, in <module>
    import MySQLdb as Database
ModuleNotFoundError: No module named 'MySQLdb'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\utils\autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\management\commands\runserver.py", line 109, in inner_run
    autoreload.raise_last_exception()
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\utils\autoreload.py", line 76, in raise_last_exception
    raise _exception[1]
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\management\__init__.py", line 357, in execute
    autoreload.check_errors(django.setup)()
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\utils\autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\apps\registry.py", line 114, in populate
    app_config.import_models()
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\apps\config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\contrib\auth\models.py", line 2, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\contrib\auth\base_user.py", line 47, in <module>
    class AbstractBaseUser(models.Model):
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\base.py", line 121, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\base.py", line 325, in add_to_class
    value.contribute_to_class(cls, name)
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\models\options.py", line 208, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\__init__.py", line 28, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\utils.py", line 207, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\utils.py", line 111, in load_backend
    return import_module('%s.base' % backend_name)
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "C:\Users\심재운\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\db\backends\mysql\base.py", line 18, in <module>
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.

 

해결방법

python 버전(cp), 파이썬 비트(win)에 맞는 mysqlclient를 다운로드 받아 command 창에서 실행해 줍니다. 저는  mysqlclient-1.4.6-cp38-cp38-win32.whl 을 다운받아서 설치했습니다.

C:\Users\temp\Downloads> pip install {다운 받은 whl 파일 이름}

설치가 되면 settings.py 파일에서 database 설정을 mysql 에 맞게 지정해 줍니다. 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database 이름',
	    'USER': 'root',
	    'PASSWORD': '비밀번호',
	    'HOST': 'localhost',
	    'POST': '3306',
    }
}

이제 mysql 에 적용하기 위해서.. 실행합니다.

python manage.py migrate

실행 완료 후, mysql workbench 가서 확인해 보시면 자동 마이그래이션 되어 생성된 테이블을 보실 수 있습니다.

이제 django 와 mysql 와 연결되어 생성된 테이블에 잘 적용되어 있는지 서버를 가동시켜 봅니다.

python manage.py runserver

 

참고자료

https://jamanbbo.tistory.com/28

 

Window 환경 Django+Mysql 연동하기! (Mysqlclient)

django에서는 데이터베이스 엔진을 default로 SQLite3 를 사용한다. SQLlite는 작고 가볍지만 대규모 프로젝트에는 사용하지 않는다. 따라서 이번에는 Window 환경에서 Mysql 데이터베이스를 django(Python 2.7)와..

jamanbbo.tistory.com

https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient

 

Python Extension Packages for Windows - Christoph Gohlke

by Christoph Gohlke, Laboratory for Fluorescence Dynamics, University of California, Irvine. Updated on 8 April 2020 at 06:39 UTC. This page provides 32- and 64-bit Windows binaries of many scientific open-source extension packages for the official CPython

www.lfd.uci.edu