使用Docker跑MySQL 作为Django的存储后端

Docker的好处不科普了,用过的都说好。
不想污染自己开发机器上的文件环境,本萌新使用Docker运行Mysql,Redis来作为Django的存储后端和缓存。

在第一次安装过程中,我遇到了一些问题,是mysqlclient客户端的问题。这个问题及其解决办法参见MacOS 下安装mysqlclient 的问题及解决办法.

在Django的settings.py文件中,我的关于数据库的配置如下

DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'solink_ticket_srv',
            'USER': 'root',
            'PASSWORD': 'aZhiUkZoXONpFzs8',
            'HOST': 'localhost',
            'PORT': '3306'
        }
    }

运行migrate后,Django抛出了一个异常,浓缩成一句就是

'Can't connect to local MySQL server through socket '/tmp/mysql.sock'

查找Google,发现了问题的所在
解答链接

原因在于我们使用localhost去连接MySQL时,将尝试通过sock file的方式去连接数据库,而我们的mysql是运行在Docker里头的,通过TCP/IP通信,所以便会出现上面的情况。
我们将settings.py文件修改如下便可实现

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'solink_ticket_srv',
            'USER': 'root',
            'PASSWORD': 'aZhiUkZoXONpFzs8',
            'HOST': '127.0.0.1',
            'PORT': '3306'
        }
    }

编写Django单元测试。
运行django test时,上述配置文件暴露了缺点。字符集问题。

正常运行Django程序时,数据库是我们创建的,此时,数据库的字符集是我们在创建数据库时指定的,当应用写入非ASCII字符时,并不会出现大问题。
但是django test运行时将创建测试数据库和测试表,上述的配置文件并没有指定字符集,那么Django创建的数据库字符集,将按照数据库的默认字符集运行,此时,如果很不幸,我们的测试中存在非ASCII字符,那么写入时Django一定会抛出异常。

此时我们的要修改配置文件为如下,其实就是针对测试数据库,指定字符集

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'solink_ticket_srv',
        'USER': 'solink_ticket_srv',
        'PASSWORD': 'aZhiUkZoXONpFzs8',
        'HOST': DB_HOST,
        'PORT': '3306',

        'TEST': {
            'CHARSET': 'utf8mb4',
            'COLLATION': 'utf8mb4_unicode_ci'
        }
    }
}
posted @ 2017-11-19 19:41  pluviophile  阅读(1880)  评论(0编辑  收藏  举报