NameError: name '_mysql' is not defined after setting change to mysql

har*_*gim 19 python mysql database sqlite django

I have a running Django blog with sqlite3 db at my local machine. What I want is to

  1. convert sqlite3 db to mysql db
  2. change Django settings.py file to serve MySQL db

Before I ran into the first step, I jumped into the second first. I followed this web page (on MacOS). I created databases called djangolocaldb on root user and have those infos in /etc/mysql/my.cnf like this:

# /etc/mysql/my.cnf

[client]
database=djangolocaldb
user=root
password=ROOTPASSWORD
default-character-set=utf8
Run Code Online (Sandbox Code Playgroud)

Of course I created db, but not table within it.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| djangolocaldb      |
| employees          |
| information_schema |
| mydatabase         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

I changed settings.py like this as the web page suggested. Here's how:

# settings.py

...

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            'OPTIONS' : {
                'read_default_file': '/etc/mysql/my.cnf',
                }
            }
        }

...
Run Code Online (Sandbox Code Playgroud)

Now, when I ran python manage.py runserver with my venv activated, I got a brutal traceback like this(I ran python manage.py migrate first, and the traceback looked almost the same anyway):

(.venv) ?  django-local-blog git:(master) ? python manage.py runserver
Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
ImportError: dlopen(/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so, 2): Library not loaded: @rpath/libmysqlclient.21.dylib
  Referenced from: /Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so
  Reason: image not found

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/gwanghyeongim/.pyenv/versions/3.7.6/lib/python3.7/threading.py", line 926, in _bootstrap_inner
    self.run()
  File "/Users/gwanghyeongim/.pyenv/versions/3.7.6/lib/python3.7/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run
    autoreload.raise_last_exception()
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/utils/autoreload.py", line 76, in raise_last_exception
    raise _exception[1]
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 357, in execute
    autoreload.check_errors(django.setup)()
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/utils/autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/Users/gwanghyeongim/.pyenv/versions/3.7.6/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/contrib/auth/models.py", line 2, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/contrib/auth/base_user.py", line 47, in <module>
    class AbstractBaseUser(models.Model):
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/db/models/base.py", line 121, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/db/models/base.py", line 325, in add_to_class
    value.contribute_to_class(cls, name)
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/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 "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/db/__init__.py", line 28, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/db/utils.py", line 207, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/db/utils.py", line 111, in load_backend
    return import_module('%s.base' % backend_name)
  File "/Users/gwanghyeongim/.pyenv/versions/3.7.6/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 16, in <module>
    import MySQLdb as Database
  File "/Users/gwanghyeongim/Documents/py/coreyMS_pj/django-local-blog/.venv/lib/python3.7/site-packages/MySQLdb/__init__.py", line 24, in <module>
    version_info, _mysql.version_info, _mysql.__file__
NameError: name '_mysql' is not defined
Run Code Online (Sandbox Code Playgroud)

So this NameError: name '_mysql' is not defined is the problem. I installed mysqlclient before, changed settings.py, made db in mysql, but none of the steps made it any helpful yet.

And I noticed that even I changed my settings.py back to sqlite3, my blog spit the same _mysql not defined error. So I ended up reverting my commit and now I'm back to sqlite3 (at least my blog is running with it).

I'm guessing it could be that I didn't convert data first, but I'm not 100% sure of it.

Any suggestion would be much appreciated. Thank you in advance!

EDITED on Aug 18, 2020

If you still see _mysql not defined error when you run python manage.py migrate somehow, check out the following two settings.

  1. If you see mysqlclient when you run pip freeze in your python virtual environment like so,
(.venv) ?  SqlDjango git:(master) ? pip freeze
...
Django==3.0.8
mysqlclient==2.0.1
...
Run Code Online (Sandbox Code Playgroud)

make sure you installed mysqlclient in your python virtual environment, not mysql-client. The former supports python3, whereas the latter supports python2, which I assume is not probably what you want.

  1. Make sure you put the following line in your bash config file(~/.zshrc for zsh, or ~/.bashrc or ~/.bash_profile for bash etc.)
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/
Run Code Online (Sandbox Code Playgroud)

After that, apply change by runnig source ~/.your_shell_config_file. See python manage.py migrate works.

Yub*_*apa 18

确保你已经安装了mysql客户端。要安装它,请编写以下命令。

pip install mysqlclient
Run Code Online (Sandbox Code Playgroud)

转到项目的settings.py文件,然后导入

import pymysql 
pymysql.install_as_MySQLdb()
Run Code Online (Sandbox Code Playgroud)

运行服务器如果没有获得名为 pymysql 的模块,则在终端运行

pip install pymysql
Run Code Online (Sandbox Code Playgroud)


har*_*gim 12

所以,我正在回答我自己的问题。由于我的博客有数据库,我尝试制作另一个没有数据库的项目,重新开始。

后来我发现是有问题导入MySQLdb模块(的mysql的子模块)这个追踪:Library not loaded: @rpath/libmysqlclient.21.dylib

浏览几个小时后,我意识到由于某种原因,Mac 安全设置阻止了正确导入。

mysqlclient库 github 上,我发现了一个与我的报告相同的问题。它建议我运行cp -r /usr/local/mysql/lib/* /usr/local/lib/. 在此之后,我设置settings.pydjango.db.backends.mysql,运行python manage.py migrate并且它起作用了。所以对于空数据库,这可能是一个解决方案。仍然在数据库一上苦苦挣扎。

我用

  • MacOS Catalina 10.15.6
  • pyenv


Mel*_*vyn 10

所以作为一个完整的答案:

如果您使用 python 包mysqlclient,您仍然需要从 Oracle/MySQL 安装 mysql 客户端。这包含 python 包使用的 C 库。更令人困惑的是:python 包实际上是用 C 编写的,以提高速度。在 MacOS 上安装这个库:

% brew install mysql-client
Run Code Online (Sandbox Code Playgroud)

还有一个纯 python 包,带有更有吸引力的 MIT 许可证,如果您的公司或客户不允许 GPL,它可以是一个解决方案。但是,它不受官方支持,并且在发布之间可能会出现一些细微的错误。天啊。

  • 它对我不起作用仍然是同样的问题 (2认同)

小智 9

这对我有用:

将此添加到路径:

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$PATH"
Run Code Online (Sandbox Code Playgroud)


Ife*_*oyi 7

在 MacBook Pro M1 macOS Monterey 上,运行此命令不起作用:

export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:$PATH"

但这对我有用:

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib
Run Code Online (Sandbox Code Playgroud)

  • 好的!很高兴您发现它很有帮助。 (2认同)

小智 6

这为我解决了这个问题:

由于Python3无法通过mysqldb与Python连接,因此您需要安装额外的模块来修复问题。安装 mysqlclient 导致我遇到同样的NameError: : name '_mysql' is not defined问题。

然而,通过使用,并在我的应用程序顶部pymysql添加代码行 ,我设法让它运行而没有任何错误!pymysql.install_as_MySQLdb()Flask

有关mysql 模块的更多信息


小智 6

我在 MacOS (Big Sur) 上遇到了同样的问题,我通过这样做修复了它 cp -r /usr/local/mysql/lib/* /usr/local/lib/


Mar*_*che 5

这为我完成了工作!只需安装 libmysqlclient-dev(sudo apt-get install libmysqlclient-dev适用于 Ubuntu)。有时,即使您刚刚安装了 mysql,lib 文件也会丢失。:)