Jon*_*nah 3 mysql django macos python-3.x pipenv
我有一个全新的 django 2.2.1 项目,我刚刚安装到 OS X (10.14.4) 上的 python 3.7 virtualenv 中。在经历了一些挫折之后,我安装了 mysqlclient,但是当我运行 django 开发服务器时,它无法识别它已安装:
以下是我迄今为止采取的步骤:
brew install mysql
pipenv --three
pipenv install django==2.2.1
pipenv install mysqlclient
brew uninstall mysql
brew install mysql-connector-c
pipenv install mysqlclient
brew unlink mysql-connector-c
brew install mysql
django-admin startproject projectname
Run Code Online (Sandbox Code Playgroud)
现在,我对开箱即用的 django 安装所做的唯一更改是将默认数据库后端更改为 django.db.backends.mysql,当我运行 django 服务器时,我得到以下信息:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
Run Code Online (Sandbox Code Playgroud)
但是,回到 virtualenv 并执行“pip install mysqlclient”会给出:
Requirement already satisfied: mysqlclient in /Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages (1.4.2.post1)
Run Code Online (Sandbox Code Playgroud)
任何想法为什么 django 看不到安装在 virtualenv 中的 mysqlclient?我可以确认以上所有内容都已在 virtualenv 中运行。我怀疑这与 OSX 让您安装它的过程有关,但我不确定如何将它分开。
我还尝试按照此处的建议将 mysqldb 替换为 pymysql ,但这会导致服务器给出不同的错误:
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
Run Code Online (Sandbox Code Playgroud)
Mysql 是为这个项目提供的,所以使用替代后端不是一种选择。非常感谢收到任何帮助,非常感谢。
更新: pip 冻结的输出:
Django==2.2.1
django-auth-ldap==1.7.0
Markdown==3.1
mysql-connector-python==8.0.16
mysqlclient==1.4.2.post1
protobuf==3.7.1
pyasn1==0.4.5
pyasn1-modules==0.2.5
PyMySQL==0.9.3
pyodbc==4.0.26
python-ldap==3.2.0
pytz==2019.1
simplejson==3.16.0
six==1.12.0
sqlparse==0.3.0
xmltodict==0.12.0
Run Code Online (Sandbox Code Playgroud)
更新 2:在 conor 的帖子之后(感谢 conor),我再次使用新的 virtualenv 重新开始,并再次成功安装了 mysqlclient1.4.2.post1。这是现在 pip freeze 的输出:
Django==2.2.1
mysqlclient==1.4.2.post1
pytz==2019.1
sqlparse==0.3.0
Run Code Online (Sandbox Code Playgroud)
但是,当我执行 python manage.py runserver 时仍然遇到相同的错误:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
Run Code Online (Sandbox Code Playgroud)
更新 3:我想我会尝试在 python 命令行上导入 MySQLdb 模块,看看我是否可以得到更多的见解,它返回以下内容:
>>> import MySQLdb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
from . import _mysql
ImportError: dlopen(/Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so, 2): Symbol not found: _mysql_affected_rows
Referenced from: /Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so
Expected in: flat namespace
in /Users/<username>/.local/share/virtualenvs/<projectname>-KrUE_JNo/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so
Run Code Online (Sandbox Code Playgroud)
解决了
所以看起来问题是在初始安装时 mysqlclient 库编译了错误的 mysql 版本(不确定这是怎么发生的),所以我不得不强制它重新编译。
以下是步骤:
brew uninstall mysql
brew uninstall myysql-connector-c
pipenv uninstall mysqlclient
brew install mysql-connector-c
Run Code Online (Sandbox Code Playgroud)
此时我们需要根据 conor 链接到的说明更新 /usr/local/bin/mysql_config(再次感谢 conor),即更改读取的行
libs="$libs -l "
Run Code Online (Sandbox Code Playgroud)
到
libs="$libs -lmysqlclient -lssl -lcrypto "
Run Code Online (Sandbox Code Playgroud)
然后,为了修复由此产生的“找不到 -lssl 的库”错误,我使用了这个问题的答案:
export PATH="/usr/local/opt/openssl/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
Run Code Online (Sandbox Code Playgroud)
然后最后强制mysqlclient重新编译重装mysql:
pip install --force-reinstall --ignore-installed --no-binary :all: mysqlclient
brew unlink mysql-connector-c
brew install mysql
Run Code Online (Sandbox Code Playgroud)
感谢所有花时间提供帮助的人!