當我們在開發一個應用時,通常會需要處理多個資料表之間的關聯。Flask SQLAlchemy 提供了強大的方法可以來處理這些關聯,讓我們可以有效地組織和檢索相關資料。今天我會介紹資料庫一堆多關聯的方式。
一對多(One-to-Many)關聯是資料庫中常見的一種關聯型態,它表示一個主要資料表(稱為「一」)中的一筆資料可以關聯到多個子資料表(稱為「多」)中的記錄。在Flask SQLAlchemy中,一對多關聯通常用於表示父子關係,其中一個主要物件(例如一位作者)可以有多個相關聯的子物件(例如多本書)。
假設我們現在正在開發一個資料庫,有文章(Post)
和作者(Author)
兩個資料表,每位作者可以有多篇文章。這是一個一對多的關聯。
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Author(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
posts = db.relationship('Post', backref='author', lazy=True)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200))
content = db.Column(db.Text)
author_id = db.Column(db.Integer, db.ForeignKey('author.id'), nullable=False)
首先我們在Author
資料模型有一個名為posts
的關聯,它通過backref
參數建立一個反向關聯,這樣可以輕鬆地從Post
找到相關的作者。backref
是 Flask SQLAlchemy 中的一個很重要的參數,用於簡化關聯資料表之間的查詢。backref
允許我們在一個資料模型中建立一個反向關聯,讓我們可以輕鬆地從關聯對象中找到相關的父對象。
# 創建一位作者
author = Author(name='J.K. Rowling')
# 創建一本書,同時設置它的作者
book = Book(title='Harry Potter and the Sorcerer\'s Stone', author=author)
# 保存到資料庫
db.session.add(author)
db.session.add(book)
db.session.commit()
當創建一個新的子對象(例如一本書)時,可以直接設置反向關聯的屬性(例如 author),Flask SQLAlchemy
將自動處理它。
author = Author.query.filter_by(name='J.K. Rowling').first()
books = author.books # 這會返回一個包含該作者所有書籍的列表
今天我只介紹了一對多關聯的一些基本用法,Flask SQLAlchemy還支援其他關聯型態,例如多對多或是一對一,可以根據開發的需求來做最適合的型態,明天我會介紹多對多的關聯型態。