[email protected]添加MySQL/MariaDB支持

Django 1.10对MySQL的支持发生了变化,请移步到新的文章

现状

首先,[email protected] 中默认的引擎为 django.db.backends.mysql 。但是在Python3中如果这样写的话,会发现 django.db.backends.mysql 依赖 MySQLdb[5] ,而 MySQLdb 又不兼容 Python3 于是要找一种新的方式来继续使用MySQL。

MySQL官方的方案

首先据MySQL文档[3]说,自从MySQL Connector/Python 1.1.1 开始,引入了 mysql.connector.django ,可直接作为 Django 的数据库引擎使用,但是我试了1.1.2和1.1.3后发现,根本不是那么回事[4]。

PyMySQL(It works)

后来,发现了 PyMySQL[1] ,支持Python3 ,google后知道如何与 Django 结合使用[2],答案如下:

首先,安装PyMySQL

for Windows

pip install PyMySQL

for Fedora

pip-python3 install PyMySQL

然后,在 Django 站点的 __init__.py 文件中添加如下两行:

import pymysql

pymysql.install_as_MySQLdb()

最后是数据库的配置(在settings.py)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', #数据库引擎
        'NAME': 'test',                       #数据库名
        'USER': 'root',                       #用户名
        'PASSWORD': 'root',                   #密码
        'HOST': '',                           #数据库主机,默认为localhost
        'PORT': '',                           #数据库端口,MySQL默认为3306
        'OPTIONS': {
            'autocommit': True,
        },
    }
}

然后同步数据库:

for Windows

python manage.py syncdb

for Fedora

python3 manage.py syncdb

OK, It works!

:本人在 Windows 7 + MariaDB 5.5 + Django 1.6.0 + Python 3.3 的环境下试验成功。

更新:在Fedora + MariaDB 5.5 + Django 1.6.0 + Python 3.3 下也测试成功。

参考链接

  1. PyMySQL的官网:https://github.com/PyMySQL/PyMySQL/
  2. Stack Overflow上关于此的一个问题:http://stackoverflow.com/questions/2636536/how-to-make-django-work-with-unsupported-mysql-drivers-such-as-gevent-mysql-or-c
  3. MySQL官方宣称支持Django:http://dev.mysql.com/doc/connector-python/en/connector-python-django-backend.html
  4. MySQL Connector/Python 1.1.3 在[email protected]下无法工作:http://www.oschina.net/question/1415937_135990
  5. MySQLdb官网(目前不支持Python3):http://sourceforge.net/projects/mysql-python/

6 thoughts on “[email protected]添加MySQL/MariaDB支持”

  1. 好像在centos 6里, 不能运行python3 manage.py syncdb

    报错是: django.db.utils.InternalError: (1046, ‘No database selected’)。 可以帮忙看看么, 谢谢。

    1. 应该是没有设置数据库,比如’NAME’: ‘test’。另外附上配置文件。

  2. File “D:\Python34\lib\site-packages\django\db\models\base.py”, line 264, in ad
    d_to_class
    value.contribute_to_class(cls, name)
    File “D:\Python34\lib\site-packages\django\db\models\options.py”, line 124, in
    contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length(
    ))
    File “D:\Python34\lib\site-packages\django\db\__init__.py”, line 34, in __geta
    ttr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
    File “D:\Python34\lib\site-packages\django\db\utils.py”, line 198, in __getite
    m__
    backend = load_backend(db[‘ENGINE’])
    File “D:\Python34\lib\site-packages\django\db\utils.py”, line 113, in load_bac
    kend
    return import_module(‘%s.base’ % backend_name)
    File “D:\Python34\lib\importlib\__init__.py”, line 109, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
    File “D:\Python34\lib\site-packages\django\db\backends\mysql\base.py”, line 30
    , in
    from MySQLdb.converters import conversions, Thing2Literal
    ImportError: cannot import name ‘Thing2Literal’

    帮忙看一下,用的环境是django1.6.6 + python3.4.1

    1. 我试了试,下面的代码是可以通过的,不知道你有没有导入PyMySQL?

      import pymysql
      pymysql.install_as_MySQLdb()
      from MySQLdb.converters import Thing2Literal

  3. 謝謝你的文章,照著你的說明設定後也成功了
    我的環境是mac+mysql+Django1.8+Python3.4.3

  4. 请问我也是报上面那个人的错误 但是我也导入了
    import pymysql
    pymysql.install_as_MySQLdb()
    from MySQLdb.converters import Thing2Literal

    from MySQLdb.converters import Thing2Literal
    ImportError: cannot import name Thing2Literal
    怎么办呢?

Leave a Reply

Your email address will not be published. Required fields are marked *

− 4 = 5