Tengo un blog de Django en ejecución con sqlite3 db en mi máquina local. lo que quiero es
Antes de dar con el primer paso, salté al segundo primero. Seguí esta página web (en MacOS). Creé bases de datos llamadas djangolocaldb en el usuario raíz y tengo esa información en /etc/mysql/my.cnf así:
# /etc/mysql/my.cnf [client] database=djangolocaldb user=root password=ROOTPASSWORD default-character-set=utf8Por supuesto, creé db, pero no una tabla dentro de él.
mysql> show databases; +--------------------+ | Database | +--------------------+ | djangolocaldb | | employees | | information_schema | | mydatabase | | mysql | | performance_schema | | sys | +--------------------+ 7 rows in set (0.00 sec) Cambié settings.py así como sugirió la página web. Así es cómo:
# 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', } } } ... Ahora, cuando ejecuté python manage.py runserver con mi venv activado, obtuve un rastreo brutal como este (ejecuté python manage.py migrate primero, y el rastreo se veía casi igual de todos modos):
(.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 Entonces este NameError: name '_mysql' is not defined es el problema. Instalé mysqlclient antes, cambié settings.py , hice db en mysql, pero ninguno de los pasos lo hizo útil todavía.
Y noté que incluso cambié mi settings.py de nuevo a sqlite3, mi blog escupe el mismo error _mysql no definido . Así que terminé revirtiendo mi compromiso y ahora estoy de vuelta en sqlite3 (al menos mi blog funciona con él).
Supongo que podría ser que no convertí los datos primero, pero no estoy 100% seguro de ello.
Cualquier sugerencia sería muy apreciada. ¡Gracias de antemano!
Si aún ve el error _mysql not defined cuando ejecuta python manage.py migrate de alguna manera, consulte las siguientes dos configuraciones.
mysqlclient cuando ejecuta pip freeze en su entorno virtual de python así, (.venv) ➜ SqlDjango git:(master) ✗ pip freeze ... Django==3.0.8 mysqlclient==2.0.1 ... asegúrese de haber instalado mysqlclient en su entorno virtual de python, no mysql-client . El primero admite python3, mientras que el último admite python2, lo que supongo que probablemente no sea lo que desea.
~/.zshrc para zsh, o ~/.bashrc o ~/.bash_profile para bash, etc.) export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/ Después de eso, aplique el cambio ejecutando source ~/.your_shell_config_file . Ver python manage.py migrate funciona.
Por lo tanto, estoy respondiendo a mi propia pregunta. Como mi blog tiene una base de datos, le di una oportunidad para hacer otro proyecto sin db, comenzar de nuevo.
Lo que noté fue que hay un problema al importar el módulo MySQLdb (submódulo de mysqlclient) con este rastreo: Library not loaded: @rpath/libmysqlclient.21.dylib .
Después de navegar unas horas, me di cuenta de que, por alguna razón, la configuración de seguridad de Mac evita que esto se importe correctamente.
En mysqlclient library github encontré un problema que informaba lo mismo que el mío. Sugiere que ejecute cp -r /usr/local/mysql/lib/* /usr/local/lib/ . Después de esto, configuré settings.py para django.db.backends.mysql , ejecuté python manage.py migrate y funcionó. Entonces, para una base de datos vacía, esta podría ser una solución. Sin embargo, todavía tengo problemas con la base de datos uno.
yo suelo
¡Esto hizo el trabajo por mí! Simplemente instale libmysqlclient-dev ( sudo apt-get install libmysqlclient-dev para Ubuntu). A veces, los archivos lib simplemente faltan incluso si acaba de instalar mysql. :)
Entonces, como una respuesta completa:
Si usa el paquete python mysqlclient , aún necesita instalar el cliente mysql desde Oracle/MySQL. Este contiene la biblioteca C que usa el paquete python. Para hacer las cosas más confusas: el paquete de python está escrito en C para aumentar la velocidad. Para instalar esta biblioteca en MacOS:
% brew install mysql-clientTambién hay un paquete de Python puro , con una licencia MIT más atractiva, que puede ser una solución si su empresa o cliente no permite GPL. Sin embargo, no es oficialmente compatible y pueden ocurrir algunos errores sutiles entre versiones. YMMV.