Python Flask 概念與實作(四) - 連接資料庫
前言
Flask內建的SQLite用作開發非常方便,但在較大型的專案中則相對來說效能較低,而Flask也支援連接其他種類的資料庫。MySQL是一個常見的資料庫管理系統,搭配docker可以更快的建立我們的DB server。
目前 Python Flask 概念與實作 大致規劃為
- 佈置環境
- Flask model運用(一)
- Web server概念(二)
- 專案檔案分佈(三)
- [連接資料庫(四)]
- 渲染模板(五)
- 登入功能(六)
- Blog功能(七)
在開發過程中,Test(測試)其實也很重要,但礙於缺乏經驗,若之後有望的話再補上(專案打包、網站優化等等亦同)
Flask中的SQLAlchemy預設是使用SQLite資料庫,而SQLite會在當前的資料夾建立一個/instance/data.db,使用SQLite作為開發固然好用,但終究不是部署用的資料庫,而MySQL是一個較常見的資料庫管理系統,當然你也可以選擇使用其他的管理系統…
先前在學習MySQL時曾在mac中安裝過MySQL,當時曾遇到一些問題,雖然已找到處理方法,但仍找不到根治的處方籤…
開機後自動開啟MySQL server
雖然說真的極少關機,通常是update或放到沒電才會遇到這類的問題,但電腦的記憶體被無預警的佔用也頗為困擾。
圖形化介面無法正常開啟/關閉
安裝MySQL server後可以透過 系統設定 > MySQL 查看server開啟/關閉的狀況,但這裡僅能查看而已,Start/Stop按鍵形同虛設,按下後完全無任何作用,做了許多功課後才得知在命令列下指令才能順利開啟/關閉,而該指令至今也忘得一乾二凈了。
MySQL with Docker
因緣際會下得知Docker技術,聽聞此技術是一門必修的課程,若能碰巧習得是再好不過了✌🏻。然後也不贅述如何安裝Docker,開啟docker後,下載MySQL鏡像檔。
docker pull mysql
Run Container
接著我們要使用這個鏡像檔將container跑起來,同時設定root的密碼。
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Test1234 -d mysql
-p <本機port>:<container port>設定連線到container的port-e <環境變數>=<變數値>設定環境變數-d在背景執行
查看執行狀況
docker ps

Stop Container
若你要停止只需執行(但停止的container仍會佔用電腦中的內存)
docker stop
查看停止狀態的container執行
docker ps -al

Restart Container
若要繼續運行停止狀態的container執行
docker restart containerID
Create User & Database
目前為止我們MySQL的container已經在背景運行,然而目前僅有root帳號,且還未建立任何資料庫供Flask使用。因此還需要
- 建立可遠端連線的user
- 建立資料庫
首先我們要進入在背景執行中的container
docker exec -it containerID bash

exec進入執行中的container-i交互式操作-t建立虛擬終端機bash使用bash
接著使用root帳號登入mysql,並使用剛才設定的密碼(Test1234)
mysql -u root -p

新增一個名稱為devp的資料庫
CREATE DATABASE devp;
新增一個user並設定其連線位置
CREATE USER 'Devp001'@'%' IDENTIFIED BY 'devp001PW';
CREATE USER '帳號'@'連線位置' IDENTIFIED BY '密碼';- % 允許此user在所有位置連線至MySQL
- localhost 允許此user在本機連線至MySQL
- 8.8.8.8 允許此user IP為8.8.8.8時連線至MySQL
設定user資料庫的存取權限
GRANT ALL PRIVILEGES ON *.* TO 'Devp001'@'%';
- ALL PRIVILEGES 包含增、改、刪所有權限
- SELECT, INSERT, UPDATE, DELETE, CREATE 指定權限

Flask Setting
目前MySQL已經成功建立,只差連線進去使用了!但python需要安裝PyMuSQL套件才可以操作MySQL
pip install pymysql
最後調整config.py中的SQLAlchemy URI就大功告成🥳
1 | # config.py |
mysql+pymysql://<帳號>:<密碼>@<主機IP>:<port>/<資料庫名稱>
然而在真正部署當中,資料庫的帳號、密碼、位置等資訊是相當重要且隱密的,通常我們不會將這些資訊寫在程式當中,若使用git很容易不小心公開到網路當中透露給其他人。因此,我們會將這些變數寫在環境變數當中,但礙於篇幅的關係下次會再介紹~
結論
- 使用docker建立MySQL container。
- 在MySQL中建立user與database。
- MySQL中結尾必須加上;❗️
- 在Flask使用MySQL作為資料庫。
- 將資料庫帳號、密碼、IP與port設定在環境變數中。