簡體   English   中英

NameError:設置更改為 mysql 后未定義名稱“_mysql”

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

我在本地機器上有一個正在運行的帶有 sqlite3 數據庫的 Django 博客。 我想要的是

  1. 將 sqlite3 數據庫轉換為 mysql 數據庫
  2. 更改 Django settings.py 文件以服務 MySQL db

在我跑到第一步之前,我先跳到第二步。 我關注了這個 web 頁面(在 MacOS 上)。 我在 root 用戶上創建了名為djangolocaldb的數據庫,並將這些信息保存在/etc/mysql/my.cnf中,如下所示:

# /etc/mysql/my.cnf

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

當然,我創建了數據庫,但沒有創建其中的表。

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

我像 web 頁面建議的那樣更改了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 的情況下運行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 not defined 錯誤 所以我最終恢復了我的提交,現在我回到了 sqlite3(至少我的博客正在運行它)。

我猜可能是我沒有先轉換數據,但我不是 100% 確定。

任何建議將不勝感激。 先感謝您!

這為我完成了工作! 只需安裝 libmysqlclient-dev ( sudo apt-get install libmysqlclient-dev for Ubuntu)。 有時,即使您剛剛安裝了 mysql,lib 文件也會丟失。 :)

所以,我正在回答我自己的問題。 因為我的博客有數據庫,所以我嘗試制作另一個沒有數據庫的項目,重新開始。

我注意到使用此回溯導入MySQLdb模塊(mysqlclient 的子模塊)時出現問題: Library not loaded: @rpath/libmysqlclient.21.dylib

瀏覽了幾個小時后,我意識到出於某種原因 Mac 安全設置無法正確導入。

mysqlclient庫 github 上,我發現一個問題與我的報告相同。 它建議我運行cp -r /usr/local/mysql/lib/* /usr/local/lib/ 在此之后,我為django.db.backends.mysql設置settings.py ,運行python manage.py migrate並且它工作。 所以對於空數據庫,這可能是一個解決方案。 盡管如此,仍在努力使用數據庫一。

我用

  • MacOS Catalina 10.15.6
  • pyenv

這對我有用:

將此添加到PATH:

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

所以作為一個完整的答案:

如果您使用 python package mysqlclient ,您仍然需要從 Oracle/MySQL 安裝 mysql 客戶端。 這包含 python package 使用的 C 庫。 更令人困惑的是:python package 實際上是用 C 編寫的,以提高速度。 在 MacOS 上安裝這個庫:

% brew install mysql-client

還有一個純 python package ,具有更有吸引力的 MIT 許可證,如果您的公司或客戶不允許 GPL,這可能是一個解決方案。 但是,它不受官方支持,並且在版本之間可能會出現一些細微的錯誤。 YMMV。

我在我的 MacOS(Big Sur)上遇到了同樣的問題,我通過執行這個cp -r /usr/local/mysql/lib/* /usr/local/lib/來修復它

這為我解決了這個問題:

由於 Python3 無法通過 mysqldb 與 Python 連接,因此您需要安裝一個額外的模塊來修復問題。 安裝 mysqlclient 導致我有相同的NameError: : name '_mysql' is not defined問題。

但是,通過使用pymysql並在我的Flask應用程序頂部添加代碼行pymysql.install_as_MySQLdb() ,我設法讓它運行而沒有任何錯誤!

有關mysql 模塊的更多信息

我只是遇到了類似的問題,幾個小時都找不到解決方案

>>> 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 個小時的嘗試和調試,好花哈哈)

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

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

但這對我有用:

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib

我同意梅爾文。

您可以通過鍵入以下內容查看您的 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 不存在。

我有同樣的錯誤,它工作了一段時間。 我在 MacOS BigSur 上進行了更新,然后它停止處理此錯誤。

要為我解決這個問題,只需簡單地卸載 django 和 mysqlclient 即可。

僅 mysqlclient 本身的卸載/重新安裝並沒有解決問題。 此外,訂單可能會有所幫助。 以下是我按順序執行的命令:

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

注意:這將安裝最新版本,因此如果您有特定版本,請確保安裝這些版本。

這對我有用

brew install mysql

使用此鏈接中的信息來解決相同的問題: https://www.py4u.net/discuss/805597

為 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

對於 # 紅帽 / CentOS

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

終於在這個問題上花費了十年之后找到了一個很好的答案。

mysqlclient是原 Python MySQL 驅動程序MySQLdb的 Python 3 兼容分支。 它仍然提供了一個名為MySQLdb的 Python 模塊。 安裝時,它會針對 MariaDB 客戶端庫或 MySQL 客戶端庫(無論您安裝哪一個)進行編譯。

亞當在這里找到的解決方案(天才家伙)

從 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的解決方案)

如果您使用的是 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"

although I used _mysql for 10 years, the MySQL website tells the recommended way for Python 3 at: https://dev.mysql.com/doc/connector-python/en/preface.html

轉換可能需要一些時間,但對我來說不到一個小時。 這是一個帶有新代碼的示例:

import mysql.connector
cnx = mysql.connector.connect(user='mensfort', password='zhongcan',
                              host='127.0.0.1', database='restaurant')
cursor = cnx.cursor()
cursor.execute('select dongle from personnel')
for dongle in cursor:
    print(dongle)
cursor.close()
cnx.close()

請使用您自己的密碼、數據庫名稱、查詢,這只是一個示例。

請卸載這個。 這對我不起作用:

pip uninstall mysql-connector

請先安裝這個。 它工作得很好:

pip install mysql-connector-python

確保您已安裝 mysql 客戶端。 要安裝它,請編寫以下命令。

pip install mysqlclient

Go 到你項目的 settings.py 文件,然后導入

import pymysql 
pymysql.install_as_MySQLdb()

運行服務器如果你沒有得到名為 pymysql 的模塊,那么在終端運行

pip install pymysql

對於 Macbook M1,此命令有效

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib

我的 django 項目在 ubuntu 22.04 上工作時遇到了同樣的問題,但是當我將下面的代碼導入到 django 項目的設置文件中時,它可以工作,

  1. 導入 pymysql
  2. pymysql.install_as_MySQLdb()

它僅在您安裝了 pymysql 時才有效,但如果您沒有安裝它,則使用 pip 安裝 pymysql。 這對我有用

配備 Ventura 的 M1 MacBook Pro; 之前工作正常然后突然開始出現此錯誤。

TLDR:

brew link mysql-client --force

我不確定我為什么開始收到此消息,但那是在我將 Mac OS 更新為 Ventura、進行了一些 Homebrew 升級並更新了 Pycharm 之后。

檢查libmysqlclient.21.dylib的實際位置以及檢查它的位置表明它根本沒有檢查正確的位置。

將正確的位置添加到PATH並沒有解決它。

將文件從mysql/lib/復制到/usr/local/lib/幾乎肯定會修復它,因為我可以看到該位置正在檢查所需的文件,但這對我來說似乎是一種解決方法,可能會導致問題未來。

我可以看到 Homebrew 目錄也被檢查,但 Homebrew 默認不鏈接這個 package。 嘗試鏈接它 ( brew link mysql-client ) 顯示警告,這是一個keg-only package 並且必須與--force鏈接。

使用brew link mysql-client --force --dry-run表明該命令只會鏈接適當的文件並且不會刪除任何內容。

所以,我認為 go 並強制鏈接它是安全的,它確實為我解決了這個問題。

我嘗試了此處列出的所有解決方案,但沒有一個對我有用。

我對此的解決方案是使用 conda 環境而不是 virtualenv。 只需將您的環境復制到 requirements.txt(為方便起見)並使用 conda 創建一個新環境。

  1. pip freeze > requirements.txt(保存你的環境)
  2. conda create -n django-env --file requirements.txt(創建新環境)
  3. pip 安裝 mysqlclient(如果尚未安裝)

我能夠連接到我的本地 mysql 數據庫以及我的 Amazon RDS 數據庫,沒問題。 我知道這不能直接解決問題。 如果您絕對必須使用 virtualenv,這將無濟於事。

我注冊了一個 Stackoverflow 帳戶只是為了分享這個。 我希望它能從 10 小時的“_mysql 未定義”地獄中拯救其他可憐的靈魂。

從 MySQL 服務器 8.xx 恢復到 5.7.x 對我有用。

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

找到@ Django 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM