一. 前言
1. 為什麼選擇 Flask-SQLAlchemy ?
Flask-SQLAlchemy 來操作資料庫是因為可以使用原生 SQL,也同時支援 ORM 框架來操作資料庫,可以隨時切換很方便。操作上若非需要很複雜的查詢,ORM 框架操作是首選,還可以防止 SQL injection。
更多相關安裝設定可以參考:[Flask教學] Flask-SQLAlchemy 資料庫連線&設定入門
2. 關於什麼是 ORM 框架?
簡單來說是直接用 Python 的語法對資料庫進行操作,不需要直接寫 SQL 語法,ORM 背後會自動將 Python 代碼轉換成應對的 SQL 語法,再來進行對資料庫的操作。
– 優點: 可讀性較高,也可以防止 SQL injection
– 缺點: 因為多了一層 python 的包裝會犧牲掉部分的效能
那麼今天這篇會以 Flask + Flask-SQLAlchemy + ORM 為主來實作操作資料庫。
二. 進入 Flask-SQLAlchemy 世界-ORM篇
1. 定義模型( model ):
Q1:Flask-SQLAlchemy 的模型定義是做什麼?
A1:模型通常是 Python 類別,它的屬性匹配對應的資料表欄位;簡單來說就是先定義好資料庫結構,接下來會利用此模型進行資料庫操作
Q2:如果資料庫表已經建立好了,還有需要定義模型嗎?
A2:需要,因為要利用模型來對資料庫進行操作
▍接下來介紹一個簡單的模型範例:
這是一個產品表格 Product 的模型
– 欄位名稱有 name ( 產品名稱 )、price ( 產品價錢 )、img ( 圖片 )、description ( 產品敘述 ) …等。
– 欄位的詳細內容設定都在 db.Column() 裡面設定,像是 db.Integer 代表數字、db.String(30) 文字 30 內 …等。
– 常見欄位選項可以參考如下:
- primary_key = True (設定為主鍵)
- unique = True (設定為不重複值)
- nullable = True (允許為空值)
- index = True (建立索引值)
- default = ‘預設值’
# main.py
# 模型( model )定義
class Product(db.Model):
__tablename__ = 'product'
pid = db.Column(db.Integer, primary_key=True)
name = db.Column(
db.String(30), unique=True, nullable=False)
price = db.Column(db.Integer, nullable=False)
img = db.Column(
db.String(100), unique=True, nullable=False)
description = db.Column(
db.String(255), nullable=False)
state = db.Column(
db.String(10), nullable=False)
insert_time = db.Column(db.DateTime, default=datetime.now)
update_time = db.Column(
db.DateTime, onupdate=datetime.now, default=datetime.now)
def __init__(self, name, price, img, description, state):
self.name = name
self.price = price
self.img = img
self.description = description
self.state = state
▍開始利用模型來建立資料庫的 table 囉
將剛剛寫好的模型定義放在 db = SQLAlchemy(app) 下面,並且在 @app.route(‘/’) 內執行 db.create_all()
# main.py
from flask import Flask, render_template, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
app = Flask(__name__)
# MySql datebase
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://account:[email protected]:3306/db"
db = SQLAlchemy(app)
# 模型( model )定義
class Product(db.Model):
__tablename__ = 'product'
pid = db.Column(db.Integer, primary_key=True)
name = db.Column(
db.String(30), unique=True, nullable=False)
price = db.Column(db.Integer, nullable=False)
img = db.Column(
db.String(100), unique=True, nullable=False)
description = db.Column(
db.String(255), nullable=False)
state = db.Column(
db.String(10), nullable=False)
insert_time = db.Column(db.DateTime, default=datetime.now)
update_time = db.Column(
db.DateTime, onupdate=datetime.now, default=datetime.now)
def __init__(self, name, price, img, description, state):
self.name = name
self.price = price
self.img = img
self.description = description
self.state = state
@app.route('/')
def index():
# Create data
db.create_all()
return 'ok'
if __name__ == "__main__":
app.run(debug=True)
▍接下來在終端機運行 python main.py
運行後進入 http://127.0.0.1:5000,然後開啟資料庫就可以看到我們的資料庫裡面建立好了剛剛定義的模型(如下圖):

2. 使用 SQLAlchemy ORM 來操作資料庫
▍新增資料
- 單筆新增資料:利用 add 的方法即可新增單筆資料
# Add data
product_max = Product('Max', 8888,'https://picsum.photos/id/1047/1200/600', '', '')
db.session.add(product_max)
db.session.commit()
- 多筆新增資料:可以將資料 append 到 list 中,然後用 db.session.add_all(p) 的方式進行新增
# Add List data
p1 = Product('Isacc', 8888, 'https://picsum.photos/id/1047/1200/600', '', '')
p2 = Product('Dennis', 9999,'https://picsum.photos/id/1049/1200/600', '', '')
p3 = Product('Joey', 7777, 'https://picsum.photos/id/1033/1200/600', '', '')
p4 = Product('Fergus', 6666,'https://picsum.photos/id/1041/1200/600', '', '')
p5 = Product('Max', 5555, 'https://picsum.photos/id/1070/1200/600', '', '')
p6 = Product('Jerry', 4444, 'https://picsum.photos/id/1044/1200/600', '', '')
p = [p1, p2, p3, p4, p5, p6]
db.session.add_all(p)
db.session.commit()

▍讀取資料
- 如果 query 沒有找到資料,會返回 None
# Read data
query = Product.query.filter_by(name='Max').first()
print(query.name)
print(query.price)
補充篩選: filter_by
query = Product.query.filter_by(name='Max').first()
# 可以用動態參數傳入
filters = {'name': 'Max', 'price': 5555}
query = Product.query.filter_by(**filters).first()
補充排序:
Product.query.filter_by(name='Max').order_by("value desc")
▍刪除資料
# Delete data
query = Product.query.filter_by(name='Max').first()
db.session.delete(query)
db.session.commit()
▍更新資料
# Updata data
query = Product.query.filter_by(name='Max').first()
# 將 price 修改成 10 塊
query.price = 10
db.session.commit()
最後~推薦 Flask 系列文章:
▍關於 Flask 教學系列目錄:
▍關於 Flask 資料庫 SQLAlchemy 文章:
- [Flask教學] Flask-SQLAlchemy 資料庫連線&設定入門 (一)
- [Flask教學] Flask-SQLAlchemy 資料庫操作-ORM篇 (二)
- [Flask教學] Flask-SQLAlchemy -ORM 一對多關聯篇 (三)
- [Flask教學] Flask-SQLAlchemy -ORM 多對多關聯篇 (四)
- [Flask教學] Flask-SQLAlchemy 資料庫操作-SQL指令篇 (五)
[Flask教學] Flask-SQLAlchemy 資料庫操作-ORM篇(二) 結束囉,感謝收看!
有關 Max行銷誌 的最新文章,都會發佈在 Max行銷誌的 Facebook 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!
在〈[Flask教學] Flask-SQLAlchemy 資料庫操作-ORM篇(二)〉中有 3 則留言
接下來在終端機運行 python main.py
運行後進入 http://127.0.0.1:5000,然後開啟資料庫就可以看到我們的資料庫裡面建立好了剛剛定義的模型(如下圖):
—-請問是用哪個程式開啟資料庫?
是用mysql workbench嗎?
你好,關於數據管理工具看要使用什麼都可以唷
個人近期比較推薦的是 TablePlus,支援多種資料庫 (MySQL, PostgreSQL, SQLite, Microsoft SQL Server) 連線、資料表介面清爽、也支援 SQL 查詢功能,完全大勝 workbench
TablePlus 官方網站 https://tableplus.com/
好的!
感謝您的分享 🙂