回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个正在运行的Django博客,在我的本地机器上运行SQLITE3DB。我想要的是</p>
<ol>
<li>将sqlite3数据库转换为mysql数据库</li>
<li>更改Django settings.py文件以服务于MySQL数据库</li>
</ol>
<p>在我跑上第一步之前,我跳上了第二步。我跟着<a href="https://www.digitalocean.com/community/tutorials/how-to-create-a-django-app-and-connect-it-to-a-database" rel="nofollow noreferrer">this web page</a>(在MacOS上)。我在root用户上创建了名为<code>djangolocaldb</code>的数据库,并在<code>/etc/mysql/my.cnf</code>中创建了如下信息:</p>
<pre><code># /etc/mysql/my.cnf
[client]
database=djangolocaldb
user=root
password=ROOTPASSWORD
default-character-set=utf8
</code></pre>
<p>当然,我创建了db,但不是其中的表</p>
<pre><code>mysql> show databases;
+--------------------+
| Database |
+--------------------+
| djangolocaldb |
| employees |
| information_schema |
| mydatabase |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)
</code></pre>
<p>根据网页的建议,我这样更改了<code>settings.py</code>。以下是方法:</p>
<pre><code># 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',
}
}
}
...
</code></pre>
<p>现在,当我运行<code>python manage.py runserver</code>并激活我的<code>venv</code>时,我得到了这样一个残酷的回溯(我首先运行<code>python manage.py migrate</code>,回溯看起来几乎一样):</p>
<pre><code>(.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
</code></pre>
<p>这就是问题所在。我之前安装了<code>mysqlclient</code>,更改了<code>settings.py</code>,在mysql中创建了db,但是这些步骤都没有任何帮助</p>
<p>我注意到,即使我把我的<code>settings.py</code>改回了sqlite3,我的博客也出现了相同的<em>\u mysql not defined error</em>。所以我最终恢复了我的提交,现在我又回到了sqlite3(至少我的博客正在运行它)</p>
<p>我猜可能是我没有先转换数据,但我不是100%确定</p>
<p>任何建议都将不胜感激。提前谢谢你</p>
<h2>编辑日期:2020年8月18日</h2>
<p>如果在运行<code>python manage.py migrate</code>时仍然看到<code>_mysql not defined</code>错误,请检查以下两个设置</p>
<ol>
<li>如果像这样在python虚拟环境中运行<code>pip freeze</code>时看到<code>mysqlclient</code></li>
</ol>
<pre><code>(.venv) ➜ SqlDjango git:(master) ✗ pip freeze
...
Django==3.0.8
mysqlclient==2.0.1
...
</code></pre>
<p>确保在python虚拟环境中安装了<code>mysqlclient</code>,而不是<code>mysql-client</code>。前者支持python3,而后者支持python2,我认为这可能不是您想要的</p>
<ol start=“2”>
<li>确保在bash配置文件中放入以下行(<code>~/.zshrc</code>用于zsh,或<code>~/.bashrc</code>或<code>~/.bash_profile</code>用于bash等)</li>
</ol>
<pre><code>export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/
</code></pre>
<p>之后,通过运行<code>source ~/.your_shell_config_file</code>应用更改。见<code>python manage.py migrate</code>作品</p>