Python Web Flask — Flask SQLAlchemy操作MySQL資料庫-1

Sean Yeh
Python Everywhere -from Beginner to Advanced
7 min readJun 2, 2021
Kamikawa, Kitami Shi, Japan, photo by Sean Yeh

SQLAlchemy是Python的一個ORM(Object-relational Mapping)框架,透過這個框架讓我們得以直接用 Python 的語法對資料庫進行操作,不需要再去寫複雜的SQL語法就能方便的操作資料庫。

曾經在上面的文章說明如何使用Flask-SQLAlchemy 操作sqlite資料庫。本篇文章則試著將sqlite資料庫替換成一般網站常用的MySQL資料庫。

前置作業

在開始說明前,我們必須先安裝需要的套件。套件中除了需要Flask、Flask-SQLAlchemy套件外,還需要安裝MySQL資料庫、PyMySQL等。

安裝Flask-SQLAlchemy套件

首先,我們需要在Flask下安裝Flask-SQLAlchemy套件。安裝方式可以參考這一篇的說明。

安裝MySQL

要使用MySQL的話,除了選擇網路上的MySQL服務外,若要使用自己的主機環境就需要自行安裝。在此我們要在開發環境中也就是自己的電腦中安裝MySQL資料庫。

大家可以透過這篇文章的說明(以Mac筆記型電腦作為開發環境)在自己的開發環境中安裝MySQL資料庫。

安裝PyMySQL

接下來需要安裝PyMySQL套件。PyMySQL是Python中用來操作MySQL的套件。在我們操作MySQL資料庫前需要先透過pip install指令安裝這套件。

$ pip install PyMySQL

修改config

記得在下面這一篇文章裡面,曾經使用sqlite作為Flask應用程式的資料庫。接下來的說明我們會以下面這個文章為基礎,從已經建立好的sqlite資料庫替換為MySQL資料庫。因此,要建立的資料表會與這篇文章中的一樣。

其中,在範例程式碼中有一行關於SQLALCHEMY_DATABASE_URI的config設定。

app.config['SQLALCHEMY_DATABASE_URI']= 'sqlite:///'+os.path.join(basedir, 'data.sqlite')

在這裡我們要將這個設定值從連接sqlite資料庫改為使用MySQL資料庫。因此我們將這一行的設定值改為:

app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:root@localhost:3306/data"

觀察目前的改變,我們可以發現,app.config[‘SQLALCHEMY_DATABASE_URI’] 的部分維持不變。

等號(=)後面被修正為mysql+pymysql://root:root@localhost:3306/data

這是表示什麼意思?

Flask-SQLAlchemy官網的文件來看,SQLALCHEMY_DATABASE_URI 的設定,在MySQL的時候應該要有username、password、server與db(如下圖示)。

對照我們剛剛的修改我們可以發現:

  • username:資料庫的使用者名稱為root。
  • password:資料庫的使用者密碼為root。
  • server:資料庫所在位置為localhost:3306。
  • db:資料庫的名稱為data。

mysql://mysql+pymysql:// 這表示我們透過PyMySQL來與MySQL資料庫進行交換。

建立資料

設定完config之後,我們需要建立data資料庫。由於SQL ALChemy不會幫我們建立資料庫,我們需要透過終端機命令自行建立資料庫。

在終端機登入mysql之後,輸入下面指令建立data 資料庫。

$ create database data;

使用data資料庫。

$ use data;

db upgrade: 同步資料庫

依照先前文章裡面的例子,我們假設已經具備以下的資料庫Model。裡面有四個欄位(_id、name、email、mobile)

class Users(db.Model):
__tablename__ = 'users'
_id = db.Column('id', db.Integer, primary_key=True) name = db.Column('name', db.String(100)) email = db.Column(db.String(100)) mobile = db.Column('mobile', db.String(100)) def __init__(self, name, email, mobile): self.name = name self.email =email self.mobile = mobile

並且已經透過Migration完成sqlite的建立。也就是說,我們已經執行過下面三個指令,並且在專案中產生了migrations的資料夾。

$ flask db init$ flask db migrate -m "說明文字"$ flask db upgrade

因此當我們要轉換成MySQL資料庫時,不需要再一次的使用 init 與 migrate 指令。只需要執行upgrade指令即可。

$ flask db upgrade

upgrade指令執行後,就會將資料表產生在data資料庫中,資料表目前是空白的。我們可以使用SQL指令查詢看看。

$ desc users;

比較一下上面的圖示,你會發現我們的資料表為users。(由__tablename__ = ‘users’決定)、欄位分別為id、name、email、mobile。其中id的資料型態Type為int(由db.Integer決定),Key為PRI(由primary_key=True決定)。而name欄位的資料型態Type為varchar(100)(由db.String(100)決定)

class Users(db.Model):    __tablename__ = 'users'    _id = db.Column('id', db.Integer, primary_key=True)    name = db.Column('name', db.String(100))    email = db.Column(db.String(100))    mobile = db.Column('mobile', db.String(100))

接下來,我們就可以使用MySQL資料庫了。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。