[英]NameError: name '_mysql' is not defined after setting change to mysql
我在本地機器上有一個正在運行的帶有 sqlite3 數據庫的 Django 博客。 我想要的是
在我跑到第一步之前,我先跳到第二步。 我關注了這個 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
並且它工作。 所以對於空數據庫,這可能是一個解決方案。 盡管如此,仍在努力使用數據庫一。
我用
這對我有用:
將此添加到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
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 項目的設置文件中時,它可以工作,
它僅在您安裝了 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 創建一個新環境。
我能夠連接到我的本地 mysql 數據庫以及我的 Amazon RDS 數據庫,沒問題。 我知道這不能直接解決問題。 如果您絕對必須使用 virtualenv,這將無濟於事。
我注冊了一個 Stackoverflow 帳戶只是為了分享這個。 我希望它能從 10 小時的“_mysql 未定義”地獄中拯救其他可憐的靈魂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.