Table
一. 前言
▍關於什麼是 ORM 架構
簡單來說是直接用 Python 的語法對資料庫進行操作,不需要直接寫 SQL 語法,ORM 背後會自動將 Python 代碼轉換成應對的 SQL 語法,再來進行對資料庫的操作。
▍關於 ORM 設定和操作更多內容可參考:
二. ORM關聯:一對多
▍定義一對多模型
設定其實很簡單:
Step1. 在一對多的一中設定 db.relationship(…) 關係
Step2. 在一對多的多中設定 db.ForeignKey(…) 關係
就完成囉~
▍舉個簡單的栗子 🌰
首先我們定義了 product、add_to_cart、user 這三個模型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
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:password@IP:3306/db" db = SQLAlchemy(app) 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=True) state = db.Column(db.String(10), nullable=False) insert_time = db.Column(db.DateTime, default=datetime.now, nullable=False) update_time = db.Column( db.DateTime, onupdate=datetime.now, default=datetime.now, nullable=False) db_product_addtocar = db.relationship("AddToCar", backref="product") def __init__(self, name, price, img, description, state): self.name = name self.price = price self.img = img self.description = description self.state = state class User(db.Model): __tablename__ = 'user' uid = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(30), unique=True, nullable=False) password = db.Column(db.String(255), nullable=False) role = db.Column(db.String(10), nullable=False) insert_time = db.Column(db.DateTime, default=datetime.now, nullable=False) update_time = db.Column( db.DateTime, onupdate=datetime.now, default=datetime.now, nullable=False) db_user_atc = db.relationship("AddToCar", backref="user") def __init__(self, name, password, role): self.name = name self.password = password self.role = role class AddToCar(db.Model): __tablename__ = 'addtocar' id = db.Column(db.Integer, primary_key=True) quantity = db.Column(db.Integer, nullable=False) state = db.Column(db.String(5), nullable=False) insert_time = db.Column(db.DateTime, default=datetime.now, nullable=False) update_time = db.Column( db.DateTime, onupdate=datetime.now, default=datetime.now, nullable=False) uid = db.Column(db.Integer, db.ForeignKey('user.uid'), nullable=False) pid = db.Column(db.Integer, db.ForeignKey('product.pid'), nullable=False) def __init__(self, uid, pid, quantity, state): self.uid = uid self.pid = pid self.quantity = quantity self.state = state |
看到上方這一長串代碼先別慌,我們只先單純看 Product 和 AddToCar 這兩個部分,他們的關係為一對多 (表示為一個 Product 可以被多個 AddToCar 包含)
首先 Product (一對多的一) 的部分需要設定 db.relationship() 來讓 SQLAlchemy 知道 Product 和 AddToCar 是有關聯的,而 backref=”product” 中的 product 則像是暗號,未來在讀取 AddToCar 表格時,後面只需像這樣加上 AddToCar.product,就可以輕鬆讀取到 Product 表格內的資料囉!
1 |
db_product_addtocar = db.relationship("AddToCar", backref="product") |
再來 AddToCar (一對多的多) 的部分需要設定 db.ForeignKey() 來告訴 SQLAlchemy 當兩張表連結時要以什麼為外接的 key。
1 |
pid = db.Column(db.Integer, db.ForeignKey('product.pid'), nullable=False) |
當 db.relationship() 和 db.ForeignKey() 都設定好後,接下來我們就來測試操作資料庫啦~
▍實作操作一對多資料庫
首先我在在資料庫裡面先存入產品( p1~p3 )和使用者( u1 )的資料
1 2 3 4 5 6 7 8 9 10 |
# 新增產品 p1 = Product('Isacc', 8888, 'https://picsum.photos/id/1047/1200/600', '', 'Y') p2 = Product('Dennis', 9999,'https://picsum.photos/id/1049/1200/600', '', 'Y') p3 = Product('Joey', 7777, 'https://picsum.photos/id/1033/1200/600', '', 'Y') # 新增使用者 u1 = User('Max', '123456', 'Admin') db.session.add_all([p1, p2, p3, u1]) db.session.commit() |
接著利用剛剛存入的資料,來達成使用者 Max 將 p1 產品加入購物車
1 2 3 4 5 |
# 新增購物車 atc1 = AddToCar(1, 1, 5, 'Y') db.session.add_all([atc1]) db.session.commit() |
成功的話,資料庫的 addtocar 表格就會像是這樣~
那我們來對 addtocar 查詢看看
1 2 3 4 5 6 7 |
# 查看 query = AddToCar.query.first() print(query.product.name) print(query.user.name) --> # Isacc --> # Max |
恭喜你已經完成一對多的新增和查詢囉~
最後~推薦 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 粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!