我有一个正在运行的Django博客,在我的本地机器上运行sqlite3 db.我想要的是

  1. 将sqlite3数据库转换为mysql数据库
  2. 更改Django settings.py文件以服务于MySQL数据库

在我跑进第一步之前,我先跳到了第二步.我关注了this web page(在MacOS上).我在root用户上创建了名为djangolocaldb的数据库,并将这些信息放在/etc/mysql/my.cnf中,如下所示:

# /etc/mysql/my.cnf

[client]
database=djangolocaldb
user=root
password=ROOTPASSWORD
default-character-set=utf8

当然,我创建了db,但没有在其中创建表.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| djangolocaldb      |
| employees          |
| information_schema |
| mydatabase         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)

我按照网页上的建议换了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激活的情况下跑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中创建了数据库,但这些步骤都没有任何帮助.

我注意到,即使我把我的settings.py改回sqlite3,我的博客也吐出了同样的_mysql not defined error.所以我最终恢复了我的提交,现在我又回到了sqlite3(至少我的博客在运行它).

我猜可能是我没有先转换数据,但我不是百分之百确定.

任何建议都将不胜感激.提前谢谢您!

EDITED on Aug 18, 2020

如果在运行python manage.py migrate时仍然看到_mysql not defined错误,请判断以下两个设置.

  1. 如果在Python虚拟环境中运行pip freeze时看到mysqlclient
(.venv) ➜  SqlDjango git:(master) ✗ pip freeze
...
Django==3.0.8
mysqlclient==2.0.1
...

确保在python虚拟环境中安装了mysqlclient,而不是mysql-client.前者支持python3,而后者支持python2,我认为这可能不是您想要的.

  1. 确保在bash配置文件中放入以下行(~/.zshrc代表zsh,~/.bashrc~/.bash_profile代表bash等)
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib/

之后,通过运行source ~/.your_shell_config_file应用更改.参见python manage.py migrate作品.

推荐答案

因此,作为一个完整的回答:

如果您使用python包mysqlclient,您仍然需要从Oracle/MySQL安装MySQL客户端.它包含python包使用的C库.让事情更混乱的是:为了提高速度,python包实际上是用C语言编写的.要在MacOS上安装此库,请执行以下操作:

% brew install mysql-client

还有一个pure python package,有一个更吸引人的麻省理工学院许可证,如果你的公司或客户不允许GPL,这可以是一个解决方案.然而,它没有得到官方的支持,而且在两个版本之间可能会出现一些细微的错误.YMMV.

Database相关问答推荐

什么时候需要手动重新分析 PostgreSQL 中的表?

如何在 Big Data 中进行模糊搜索

哪个能够存储 1 亿条记录的嵌入式数据库具有高效的 C 或 C++ API

从 DbDataReader 读取数据的最快方法是什么?

如何在 Windows 中安装 InfluxDB?

我应该为我创建的新创建的 PostgreSQL 模式使用什么正确的文件扩展名?

ORM vs 传统数据库查询,它们的字段是什么?

如何在 MSSQL 2005 中创建递归查询?

用 Python 永久存储字典的优雅方式?

xtradb vs innodb

我什么时候应该考虑使用内存数据库,需要注意什么问题?

此平台不支持 LocalDB

如何将mysql的默认端口从3306更改为3360

什么是非关系数据库的例子?

数据库 - 设计 Events事件表

如何在没有验证提取的情况下将 MSSQLServer 数据库提取为 .dacpac?

如何在文件系统中存储图像

分离实体和被管理实体

xampp phpmyadmin,格式参数不正确

用于 sql 表中的状态列的类型