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