我們在學習和開發Django的時候,一般是使用SQLite作為數據庫。在正式講網站部署上線是用MySQL數據庫比較多。MySQL支持高並發的訪問,而且相對於SQLite,MySQL性能更好。下面講講如何在Django下安裝和使用MySQL。
1、下載MySQL
打開MySQL Community Server下載頁面,這里我下載Windows最新版本的zip包,如下圖所示。
這里我用8.0的版本,官方說它要比5.7的版本快。若你之前使用的是5.7版本,照舊使用5.7也行。
2、安裝MySQL
下載完成之后,解壓zip包,再把整個解壓之后的結果放到C盤(其他盤也可以)。打開這個MySQL文件夾,里面的文件如下圖所示:
3、配置MySQL
這里MySQL的安裝目錄為C:\mysql-8.0.15-winx64,記住該路徑,等下我們配置的時候需要用到。
在該安裝目錄下,新建一個文件叫my.ini。打開該文件,並寫入如下內容:
[mysqld] # 設置mysql的安裝目錄,我們實際存放MySQL的目錄 basedir=C:/mysql-8.0.15-winx64 # 設置mysql數據庫的數據的存放目錄 datadir=C:/mysql-8.0.15-winx64/data # 設置默認使用的端口 port=3306 # 允許最大連接數 max_connections=200 # 允許連接失敗的次數。這是為了防止有人試圖攻擊數據庫 max_connect_errors=10 # 服務端使用的字符集 character-set-server=utf8mb4 # 數據庫字符集對應一些排序等規則使用的字符集 collation-server=utf8mb4_general_ci # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB # 默認使用“mysql_native_password”插件作為認證加密方式 # MySQL8.0默認認證加密方式為caching_sha2_password default_authentication_plugin=mysql_native_password [mysql] # 設置mysql客戶端默認字符集 default-character-set=utf8mb4 [client] default-character-set=utf8mb4 port=3306
其中,要注意幾個配置:
1、配置路徑要注意斜杠的寫法,要么寫"\\",要么寫"/";
2、數據庫數據存放的目錄需要確保文件夾存在,所以我們需要手動在我們指定的目錄創建一個data文件夾;
3、MySQL8.0的默認認證加密方式和之前版本不同,為了兼容,設置為mysql_native_password,若不設置,后面會報錯,詳情見Django2.x連接MySQL8.x的錯誤解析.
更多配置可以參考MySQL的文檔。
4、把MySQL的bin目錄加入環境變量
為了方便使用命令,把MySQL的bin目錄的路徑加入系統環境變量Path中。
我們現在MySQL安裝路徑為C:\mysql-8.0.15-winx64,則bin目錄的路徑為C:\mysql-8.0.15-winx64\bin。記住該路徑,根據你具體情況設置。
右鍵我的電腦,選擇“屬性”-->“環境變量”。
找到“Path”這一項,雙擊打開編輯。光標定位到末尾,輸入一個英文狀態下的分號,再粘貼bin目錄的路徑進去,再保存即可。
設置好之后,后面我們可以直接在cmd直接使用MySQL的相關命令。
5、初始化MySQL
打開cmd,快捷鍵“win+R”,輸入cmd再回車,即可打開cmd。
執行初始化命令,該命令會創建一個密碼為空的root用戶。
mysqld --initialize-insecure --user=mysql --console
執行初始化命令成功之后,再執行下面的命令,安裝mysql服務:
mysqld --install
安裝服務成功之后,啟動服務:
net start mysql
這樣,mysql服務就啟動了。
ps:若你想刪除mysql服務可以執行“sc delete mysql”命令。
6、修改root用戶的密碼
上面步驟成功之后,可以在cmd輸入如下命令進入MySQL:
mysql -u root -p
-u root 是指定root用戶登錄,-p 是要求輸入密碼。剛剛初始化創建的密碼為空,要求輸入密碼的時候,直接回車即可。成功登錄進去,即可看到如下界面:
輸入如下SQL語句,修改root用戶的密碼:
alter user 'root'@'localhost' identified by '你的密碼';
ps:如果之前已經安裝並使用過Mysql,可跳過1-6步驟,直接進行第7步驟。
7、為Django項目創建數據庫
Django項目有自己的數據庫,我們需要在MySQL中創建一個數據庫給Django使用。登錄MySQL后,輸入如下SQL語句創建數據庫:
CREATE DATABASE 你的數據庫名稱 DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE utf8_unicode_ci;
ps:這里的字符集用utf8mb4和規則用utf8mb4_unicode_ci都可以。記得輸入你的數據庫名稱哦~
8、為Django專門管理該項目數據庫的MySQL用戶
在這里,我不建議使用root用戶直接管理數據庫。為了安全考慮,我們需要創建一個用戶專門管理我們Django項目的數據庫。
在MySQL內輸入如下SQL語句創建用戶:
CREATE USER '你的用戶名'@'localhost' IDENTIFIED BY '你的密碼';
接下,再把剛剛創建的數據庫的管理權限給予剛剛創建的MySQL用戶:
GRANT ALL PRIVILEGES ON 你的數據庫名.* TO '你的用戶名'@'localhost';
最后,刷新權限:
FLUSH PRIVILEGES;
ps:把“你的數據庫名”、“你的用戶名”和“你的密碼”改成你對應的內容哦。
9、安裝mysqlclient
Django要使用MySQL的話,需要安裝mysqlclient庫。
你可以直接執行pip install mysqlclient命令,進行安裝。但這個在windows系統可能會報錯,編譯不了。
這種情況,可以用whl包安裝該庫。打開https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient,下載對應python版本和windows版本的mysqlclient文件。例如我的電腦python是3.6版本,windows是64位,需要下載的版本為帶有cp36,win_amd64字樣的文件。
下載完成之后,cmd進入該文件的目錄,用pip安裝即可(下面用到具體文件名,這個根據看你下載的輸入命令):
pip install mysqlclient-1.3.13-cp36-cp36m-win_amd64.whl
10、修改Django數據庫配置
打開你的Django項目的settings.py文件,找到DATABASES的配置。我們之前的SQLite配置如下:
現在將其改成:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的數據庫名', 'USER': '你的MySQL用戶名', 'PASSWORD': '你的密碼', 'HOST': 'localhost', 'PORT': '3306', } }
ps:把上面那些“你的。。。”對應改一下。
11、用數據庫遷移文件創建數據庫的表
之前我們開發的時候,多少會生成一些數據庫遷移文件。沒有的話,用python manage.py makemigrations生成一下。
用如下命令應用遷移文件,這樣數據庫中的表也跟着創建。
python manage.py migrate
如果之前跳過1-6步驟的,沒有把 MySQL8.0的認證加密方式設置為mysql_native_password,則執行遷移命令的時候,將會報錯(django.db.utils.OperationalError: (2059, <NULL>)),詳情見Django2.x連接MySQL8.x的錯誤解析.
12、把SQLite數據導入到MySQL中
如果我們之前開發的數據有用或者想搬到MySQL數據庫中,我們需要把數據遷移過去。
數據從一個數據庫搬到另外一個數據庫,只需要兩個步驟。舊數據庫導出數據,新數據庫導入數據。
1)SQLite導出數據
先將Django的數據庫配置改回來:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
然后,在cmd執行導出命令:
python manage.py dumpdata > data.json
這樣就將數據導出到Django項目根目錄下的data.json文件。
2)MySQL導入數據
同樣,先將Django的數據庫配置改為MySQL的:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的數據庫名', 'USER': '你的MySQL用戶名', 'PASSWORD': '你的密碼', 'HOST': 'localhost', 'PORT': '3306', } }
然后,在cmd執行導入命令:
python manage.py loaddata data.json
這里需要等一下,而且可能會出錯。注意出錯的時候所報的錯誤信息。如果提示有重復主鍵,那需要先刪掉數據。這些數據是在給MySQL數據庫應用遷移文件的時候產生的,一般是content_type相關的表。
進入到MySQL,執行如下的SQL語句:
use 你的數據庫名; delete from auth_permission; delete from django_content_type;
刪除數據之后,再執行一次導入命令即可。基本上,導入不了數據都是MySQL存在數據導致的。
其他注意事項:加載時區表
另外,有可能所安裝的MySQL沒有加載時區表。這個可能會導致filter對日期的查詢有問題。Django官方文檔也指出這個問題。MySQL官網也有對應處理方法:加載時區表。
Linux/Mac解決方法都很簡單。windows系統要先下載一個sql文件:timezone_2018e_posix_sql.zip。
下載完成之后,解壓得到一個sql文件,再執行cmd命令導入該文件即可:
mysql -u root -p mysql < timezone_posix.sql