使用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'
}
}
}