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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM