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名称错误 我对@987654330@ 中的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”的主要内容,如果未能解决你的问题,请参考以下文章