Python Flask 概念與實作(四) - 連接資料庫

前言

Flask內建的SQLite用作開發非常方便,但在較大型的專案中則相對來說效能較低,而Flask也支援連接其他種類的資料庫。MySQL是一個常見的資料庫管理系統,搭配docker可以更快的建立我們的DB server。


目前 Python Flask 概念與實作 大致規劃為

  1. 佈置環境
  2. Flask model運用(一)
  3. Web server概念(二)
  4. 專案檔案分佈(三)
  5. [連接資料庫(四)]
  6. 渲染模板(五)
  7. 登入功能(六)
  8. 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

MySQL container

Stop Container

若你要停止只需執行(但停止的container仍會佔用電腦中的內存)

docker stop 

查看停止狀態的container執行

docker ps -al

stop container

Restart Container

若要繼續運行停止狀態的container執行

docker restart containerID

Create User & Database

目前為止我們MySQL的container已經在背景運行,然而目前僅有root帳號,且還未建立任何資料庫供Flask使用。因此還需要

  1. 建立可遠端連線的user
  2. 建立資料庫

首先我們要進入在背景執行中的container

docker exec -it containerID bash

MySQL Container

  • exec 進入執行中的container
  • -i 交互式操作
  • -t 建立虛擬終端機
  • bash 使用bash

接著使用root帳號登入mysql,並使用剛才設定的密碼(Test1234)

mysql -u root -p

MySQL Login

新增一個名稱為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 指定權限

MySQL Setting

Flask Setting

目前MySQL已經成功建立,只差連線進去使用了!但python需要安裝PyMuSQL套件才可以操作MySQL

pip install pymysql

最後調整config.py中的SQLAlchemy URI就大功告成🥳

1
2
3
4
5
6
# config.py
class Config(object):
# Database Configuration
# SQLALCHEMY_DATABASE_URI = os.getenv("DATABASE_URI") or 'sqlite:///data.db'
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://Devp001:devp001PW@localhost:3306/devp'
SQLALCHEMY_TRACK_MODIFICATIONS = False
  • mysql+pymysql://<帳號>:<密碼>@<主機IP>:<port>/<資料庫名稱>

然而在真正部署當中,資料庫的帳號、密碼、位置等資訊是相當重要且隱密的,通常我們不會將這些資訊寫在程式當中,若使用git很容易不小心公開到網路當中透露給其他人。因此,我們會將這些變數寫在環境變數當中,但礙於篇幅的關係下次會再介紹~

結論

  • 使用docker建立MySQL container。
  • 在MySQL中建立user與database。
  • MySQL中結尾必須加上;❗️
  • 在Flask使用MySQL作為資料庫。
  • 將資料庫帳號、密碼、IP與port設定在環境變數中。