NameError:设置更改为 mysql 后未定义名称“_mysql”

Posted

技术标签:

【中文标题】NameError:设置更改为 mysql 后未定义名称“_mysql”【英文标题】:NameError: name '_mysql' is not defined after setting change to mysql 【发布时间】:2020-11-16 11:15:42 【问题描述】:

我在本地机器上有一个正在运行的带有 sqlite3 db 的 Django 博客。我想要的是

    将 sqlite3 数据库转换为 mysql 数据库 更改 Django settings.py 文件以服务 MySQL db

在我跑到第一步之前,我先跳到了第二步。我关注了this web page(在 MacOS 上)。我在 root 用户上创建了名为 djangolocaldb 的数据库,并在 /etc/mysql/my.cnf 中有这些信息,如下所示:

# /etc/mysql/my.cnf

[client]
database=djangolocaldb
user=root
password=ROOTPASSWORD
default-character-set=utf8

当然,我创建了 db,但没有在其中创建表。

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

我按照网页建议的方式更改了settings.py。方法如下:

# 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',
                
            
        

...

现在,当我在激活venv 的情况下运行python manage.py runserver 时,我得到了这样的残酷回溯(我先运行python manage.py migrate,无论如何回溯看起来几乎相同):

(.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

所以这个NameError: name '_mysql' is not defined 是问题所在。我之前安装了mysqlclient,更改了settings.py,在mysql 中创建了db,但是这些步骤都没有帮助。

我注意到,即使我将settings.py 改回 sqlite3,我的博客也出现了同样的 _mysql 未定义错误。所以我最终恢复了我的提交,现在我回到了 sqlite3(至少我的博客正在使用它)。

我猜可能是我没有先转换数据,但我不是 100% 确定。

任何建议将不胜感激。提前谢谢!

2020 年 8 月 18 日编辑

如果您在以某种方式运行 python manage.py migrate 时仍然看到 _mysql not defined 错误,请检查以下两个设置。

    如果像这样在 python 虚拟环境中运行 pip freeze 时看到 mysqlclient
(.venv) ➜  SqlDjango git:(master) ✗ pip freeze
...
Django==3.0.8
mysqlclient==2.0.1
...

确保您在 python 虚拟环境中安装了mysqlclient,而不是mysql-client。前者支持python3,后者支持python2,我想这可能不是你想要的。

    确保将以下行放在 bash 配置文件中(~/.zshrc 用于 zsh,~/.bashrc~/.bash_profile 用于 bash 等)
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/

之后,通过 runnig source ~/.your_shell_config_file 应用更改。请参阅python manage.py migrate 作品。

【问题讨论】:

确保你已经安装了自制的 mysql 客户端:brew install mysql-client 以便 libmysqlclient 可用(官方 MySQL C 库,pyhton 扩展使用)。 @Melvyn 现在我已经运行了brew install mysql-client,我有不同的回溯。 'blah blah blah ...' 和 django.core.exceptions.ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the NAME value. 看起来我取得了一些进展。我现在会调查一下。谢谢! 您是否尝试过here 列出的步骤?可能并不总是推荐的路径,但它适用于我的用例。 在 Apple M1 上工作,Jakob 提到的链接是使其正常工作的关键。不要忘记在设置底部添加“伪造”版本的行! adamj.eu/tech/2020/02/04/how-to-use-pymysql-with-django 【参考方案1】:

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

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

% brew install mysql-client

还有一个pure python package,具有更有吸引力的 MIT 许可证,如果您的公司或客户不允许 GPL,这可能是一个解决方案。但是,它不受官方支持,并且在版本之间可能会出现一些细微的错误。 YMMV。

【讨论】:

【参考方案2】:

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

我注意到导入 MySQLdb 模块(mysqlclient 的子模块)时出现问题,此回溯:Library not loaded: @rpath/libmysqlclient.21.dylib

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

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

我用

MacOS Catalina 10.15.6 pyenv

【讨论】:

这对我有用,django 3,venv,mysql 8,mac 11.0 这对我不起作用。请提供任何帮助。仍然得到相同的错误_mysql名称错误 我对@9​​87654330@ 中的mysql 进行了小修改。如果我犯了错误或出于任何其他原因,请随时恢复它。 @harryghgim【参考方案3】:

这为我解决了这个问题:

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

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

更多信息mysql modules

【讨论】:

【参考方案4】:

我刚遇到类似的问题,几个小时都找不到解决方案

>>> import MySQLdb
Traceback (most recent call last):
  File "/path-to-venv/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
ImportError: /path-to-venv/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-arm-linux-gnueabihf.so: failed to map segment from shared object

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/path-to-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

所以如果这里有人像我一样在挂载的分区/磁盘上拥有 virtualenv,你必须用 exec 挂载它,这就是整个问题。

按照https://askubuntu.com/questions/311438/how-to-make-tmp-executable 中的说明重新挂载具有可执行权限的分区。

如果您使用 fstab 安装驱动器,请参阅:https://askubuntu.com/questions/678857/fstab-doesnt-mount-with-exec。

(好吧,那是 10 小时的尝试和调试,好花哈哈)

【讨论】:

遇到了类似的问题。运行pythonc -c "import MySQLdb" 是测试它是否有效的最简单方法。我的解决方案是将缺少的库文件从 /usr/lib/x86_64-linux-gnu/libmariadb,mysqlclient* 复制到我的图像中。【参考方案5】:

从 MySQL 服务器 8.x.x 恢复到 5.7.x 对我有用。

Django 支持 MySQL 5.5.x - 5.7.x。不支持 MySQL 8 及更高版本。

找到@Django Docs

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

这对我有用:

将此添加到 PATH:

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

我同意梅尔文。

您可以通过键入以下内容来查看您的 MySQL 库链接:

(quantum) chaiyudeMacBook-Pro:quantum chaiyu$ python
Python 3.8.7 (v3.8.7:6503f05dd5, Dec 21 2020, 12:45:15) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb as Database
Traceback (most recent call last):
  File "/Users/chaiyu/Envs/quantum/lib/python3.8/site-packages/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
ImportError: dlopen(/Users/chaiyu/Envs/quantum/lib/python3.8/site-packages/MySQLdb/_mysql.cpython-38-darwin.so, 2): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib
  Referenced from: /Users/chaiyu/Envs/quantum/lib/python3.8/site-packages/MySQLdb/_mysql.cpython-38-darwin.so
  Reason: image not found

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/chaiyu/Envs/quantum/lib/python3.8/site-packages/MySQLdb/__init__.py", line 24, in <module>
    version_info, _mysql.version_info, _mysql.__file__
NameError: name '_mysql' is not defined

然后输入:

(quantum) chaiyudeMacBook-Pro:quantum chaiyu$ otool -L /Users/chaiyu/Envs/quantum/lib/python3.8/site-packages/MySQLdb/_mysql.cpython-38-darwin.so
/Users/chaiyu/Envs/quantum/lib/python3.8/site-packages/MySQLdb/_mysql.cpython-38-darwin.so:
    /usr/local/opt/mysql/lib/libmysqlclient.21.dylib (compatibility version 21.0.0, current version 21.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
(quantum) chaiyudeMacBook-Pro:quantum chaiyu$ ls -l /usr/local/opt/mysql/lib/libmysqlclient.21.dylib
ls: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib: No such file or directory

然后,我发现 MySQL 链接的库不存在。

【讨论】:

【参考方案10】:

我遇到了同样的错误,它工作了一段时间。我在 MacOS BigSur 上进行了更新,然后它停止工作并出现此错误。

要为我解决这个问题,只需简单地卸载重新安装 django 和 mysqlclient。

仅 mysqlclient 本身的卸载/重新安装并没有解决问题。此外,订单可能会有所帮助。以下是我按顺序执行的命令:

pip uninstall mysqlclient
pip uninstall django
pip install django
pip install mysqlclient

注意:这将安装最新版本,因此如果您有特定版本,请确保安装这些版本。

【讨论】:

【参考方案11】:

这对我有用

brew install mysql

【讨论】:

【参考方案12】:

Mac 版

假设您正在激活 Python 3 venv

brew install mysql
pip install mysqlclient

ubuntu 在终端运行

sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
pip install mysqlclient

用于#Red Hat / CentOS

sudo yum install python3-devel mysql-devel
pip install mysqlclient

【讨论】:

【参考方案13】:

在这个问题上花了近十年的时间终于找到了一个很好的答案。

mysqlclient 是原始 Python MySQL 驱动程序MySQLdb 的 Python 3 兼容分支。它仍然提供了一个名为MySQLdb 的Python 模块。安装时,它会针对 MariaDB 客户端库或 MySQL 客户端库进行编译 - 无论您已安装哪个。

解决方案找到 Here 由 Adam(Genius Guy)

【讨论】:

【参考方案14】:

从 Apple Silicon M1 Mac 和 conda 环境中,唯一对我有用的解决方案是使用 Miniforge 安装,它与 Miniconda 相当,但默认通道为 conda-forge。有一个 Apple Silicon 选项为我解决了这个问题:https://github.com/Haydnspass/miniforge#download

(来自https://towardsdatascience.com/using-conda-on-an-m1-mac-b2df5608a141的解决方案)

【讨论】:

请从包含的链接中包含相关代码和资源。如果链接页面消失,这将防止答案失效。 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review【参考方案15】:

如果您使用的是 bash,请使用:

open -t .bash_profile 

并添加以下内容:

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

如果您使用的是 Zsh,请使用:

open -t ~/.zshrc 

并添加以下内容:

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

【讨论】:

以上是关于NameError:设置更改为 mysql 后未定义名称“_mysql”的主要内容,如果未能解决你的问题,请参考以下文章

将数据库从 MySQL 更改为 SQLite 后出现 Java 项目错误

MySQL日期更改为JPA保存后的昨天日期

将语法从 sqlplus 格式更改为 mysql 格式

将mysql时区更改为中国时间? [复制]

将 hybris 数据库更改为 MySQL

将 mysql 更改为 mysqli 及其 xampp 版本