Установка свежего python 3.7 / django 2.2.1 не распознает, что установлен mysqlclient - PullRequest
2 голосов
/ 13 мая 2019

У меня есть совершенно новый проект django 2.2.1, который я только что установил в python 3.7 virtualenv на OS X (10.14.4). После некоторых разочарований я установил mysqlclient, но когда я запускаю сервер django dev, он не распознает, что он установлен:

Вот шаги, которые я предпринял до сих пор:

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

Теперь единственное изменение, которое я внес в стандартную установку django, - это изменение базы данных по умолчанию на django.db.backends.mysql, и при запуске сервера django я получаю следующее:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

Однако, возвращаясь к 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)

Есть идеи, почему django не видит mysqlclient, установленный в virtualenv? Я могу подтвердить, что все вышеперечисленное было выполнено в 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.

Mysql дан для этого проекта, поэтому использование альтернативного бэкэнда не вариант. Любая помощь с благодарностью получена, большое спасибо заранее.

ОБНОВЛЕНИЕ: Вывод стоп-кадра:

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

ОБНОВЛЕНИЕ 2: После сообщения Конора (спасибо Конор) я снова начал с свежего virtualenv и снова успешно установил mysqlclient1.4.2.post1. Вот вывод из pip freeze сейчас:

Django==2.2.1
mysqlclient==1.4.2.post1
pytz==2019.1
sqlparse==0.3.0

По-прежнему получаю ту же ошибку, когда я делаю python manage.py runserver, хотя:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

ОБНОВЛЕНИЕ 3: Я подумал, что я бы попытался импортировать модуль MySQLdb в командной строке python, чтобы посмотреть, смогу ли я узнать больше, и он вернет следующее:

>>> 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

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Если вы работаете на macos, сделайте это

$ brew uninstall mysql
$ brew install mysql-connector-c
$ brew unlink mysql-connector-c
$ brew install mysql
$ pip install mysql-python

и следуйте инструкциям здесь: https://pypi.org/project/mysqlclient/

1 голос
/ 15 мая 2019

решено

Похоже, проблема заключалась в том, что при первоначальной установке библиотека mysqlclient была скомпилирована с неверной версией mysql (не знаю, как это произошло), поэтому мне пришлосьзаставить его перекомпилировать.

Вот шаги:

brew uninstall mysql
brew uninstall myysql-connector-c
pipenv uninstall mysqlclient
brew install mysql-connector-c

На этом этапе нам нужно обновить / usr / local / bin / mysql_config в соответствии с инструкциями, связанными с конором (спасибоснова conor), т.е. измените строку, которая читает

libs="$libs -l "

на

libs="$libs -lmysqlclient -lssl -lcrypto "

Затем , чтобы исправить результирующую ошибку «библиотека не найдена для -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"

Затем, наконец, заставьте mysqlclient перекомпилировать и переустановить mysql:

pip install --force-reinstall --ignore-installed --no-binary :all: mysqlclient
brew unlink mysql-connector-c
brew install mysql

Спасибо всем, кто нашел время, чтобы помочь!

...