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

2024-09-30 03:22:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

在我跑上第一步之前,我跳上了第二步。我跟着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',
                }
            }
        }

...

现在,当我运行python manage.py runserver并激活我的venv时,我得到了这样一个残酷的回溯(我首先运行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

这就是问题所在。我之前安装了mysqlclient,更改了settings.py,在mysql中创建了db,但是这些步骤都没有任何帮助

我注意到,即使我把我的settings.py改回了sqlite3,我的博客也出现了相同的\u mysql not defined error。所以我最终恢复了我的提交,现在我又回到了sqlite3(至少我的博客正在运行它)

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

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

编辑日期:2020年8月18日

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

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

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

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

之后,通过运行source ~/.your_shell_config_file应用更改。见python manage.py migrate作品


Tags: djangoinpyvenvliblocallinesite
3条回答

因此,作为一个完整的答案:

如果您使用python包mysqlclient,您仍然需要从Oracle/mysql安装mysql客户端。它包含python包使用的C库。让事情变得更加混乱:python包实际上是用C编写的,以提高速度。要在MacOS上安装此库,请执行以下操作:

% brew install mysql-client

还有一个pure python package,有一个更吸引人的MIT许可证,如果你的公司或客户不允许GPL,这可能是一个解决方案。然而,它并没有得到官方的支持,在两个版本之间可能会出现一些微妙的错误。YMMV

所以,我在回答我自己的问题。因为我的博客有数据库,我给了它一个机会去做另一个没有数据库的项目,重新开始

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

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

mysqlclient库github上,我发现one issue报告的内容与我的相同。它建议我运行cp -r /usr/local/mysql/lib/* /usr/local/lib/。在这之后,我为django.db.backends.mysql设置了settings.py,运行了python manage.py migrate,它就工作了。所以对于空数据库,这可能是一个解决方案。但仍在为数据库1而挣扎

我用

  • MacOS Catalina 10.15.6
  • 皮恩夫

这对我很有用:

将此添加到路径:

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

相关问题 更多 >

    热门问题