Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

Django 信號(Signals) vs SQL 觸發器(Triggers):關係與差異解析

最後更新:2025年3月4日資料庫

本文為 SQL 關聯資料庫 基本介紹系列文,第 3 篇:

  1. 關聯式資料庫與資料完整性:初學者指南
  2. SQL 觸發器(Triggers):自動執行的資料庫機制
  3. Django 信號(Signals) vs SQL 觸發器(Triggers):關係與差異解析 👈進度
  4. 關聯式資料庫與交易(Transaction)機制入門
  5. 深入理解死結(Deadlock)與發生條件
  6. DCL(資料控制語言)入門:SQL 權限管理基礎
  7. SQL 儲存程序(Stored Procedure)入門
  8. ORM(對象關係對映):讓資料庫操作更簡單的工具
  9. SQL 儲存程序 vs ORM:如何選擇最適合的數據庫操作方式?
  10. 關聯式資料庫 View(檢視)是什麼?完整指南
  11. 理解 Materialized View:初學者指南

在開發 Django 應用程式時,我們常常需要在 資料變更(如新增、更新、刪除)時執行某些自動化操作,例如:

  • 當新用戶註冊時,自動發送歡迎郵件 📩
  • 當刪除某個產品時,自動清除相關的訂單資訊 🛒
  • 當某個欄位更新時,自動記錄變更歷史 📜

在 Django 中,我們通常會使用 信號(Signals) 來處理這類事件驅動的操作,而在資料庫層級,則有 SQL 觸發器(Triggers) 來達成類似的效果。

兩者雖然概念相似,但適用的場景和工作方式卻大不相同。

本篇文章將深入探討 Django Signals 與 SQL Triggers 之間的關係、主要差異,以及如何根據不同的需求選擇適合的方案。


什麼是 Django Signals?

Django Signals 的概念

Django Signals(信號) 是 Django 提供的一種機制,允許不同部分的應用程式在某些事件發生時自動執行對應的邏輯,類似於「事件驅動」模式。

簡單來說,當某個 Model 發生 新增(INSERT)、更新(UPDATE)、刪除(DELETE) 時,可以透過 Signals 觸發特定函數來執行自動化動作。

Django Signals 的運作方式

Django 內建多種信號,最常用的包括:

  • pre_save / post_save:模型儲存前/後執行
  • pre_delete / post_delete:模型刪除前/後執行
  • m2m_changed:多對多關係變更時執行

範例:當新用戶被創建時,自動發送歡迎郵件

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from django.core.mail import send_mail

@receiver(post_save, sender=User)
def send_welcome_email(sender, instance, created, **kwargs):
    if created:  # 只有在新用戶被創建時執行
        send_mail(
            subject="歡迎來到我們的網站",
            message="感謝您註冊我們的網站,希望您有美好的體驗!",
            from_email="admin@example.com",
            recipient_list=[instance.email]
        )

Django Signals 的應用場景

✅ 適用於應用層邏輯,如:

  • 通知系統(如新用戶註冊後發送 Email)
  • 日誌記錄(如紀錄 Model 變更)
  • 觸發外部 API(如將新訂單同步到第三方系統)

❌ 不適用於數據完整性,如:

  • 確保 total_price = quantity * price
  • 限制某個欄位的值不可超過某個範圍

這類應用通常更適合使用 SQL 觸發器。


什麼是 SQL Triggers?

SQL 觸發器(Triggers)的概念

SQL 觸發器(Triggers) 是資料庫中的一種自動執行機制,當特定事件(INSERT、UPDATE、DELETE)發生時,會自動執行一段 SQL 程式。

SQL 觸發器適用於 資料庫層級的數據完整性保護,它可以直接影響資料,並確保所有操作符合特定規則。

SQL 觸發器的運作方式

觸發器分為:

  • BEFORE INSERT / AFTER INSERT:插入資料前/後執行
  • BEFORE UPDATE / AFTER UPDATE:更新資料前/後執行
  • BEFORE DELETE / AFTER DELETE:刪除資料前/後執行

範例:當新訂單被插入時,自動計算 total_price

CREATE TRIGGER update_total_price
BEFORE INSERT ON orders
FOR EACH ROW
BEGIN
    SET NEW.total_price = NEW.quantity * NEW.unit_price;
END;

SQL 觸發器的應用場景

✅ 適用於資料庫層級邏輯,如:

  • 自動計算欄位數值
  • 防止刪除重要數據
  • 確保數據完整性

❌ 不適用於應用層邏輯,如:

  • 發送 Email
  • 觸發 API 呼叫
  • 需要跨多個資料庫的操作

這類應用應該用 Django Signals 來處理。


Django Signals vs SQL Triggers:主要差異

特性Django SignalsSQL Triggers
作用層級Django 應用層(Python)資料庫層(SQL)
觸發條件Model 的 save() 或 delete()SQL 操作(INSERT、UPDATE、DELETE)
可執行的動作發送郵件、觸發 API、日誌記錄修改數據、限制操作、計算欄位值
影響範圍Django ORM 內部整個資料庫,包括 Django 之外的操作
可移植性與 Django 應用綁定依賴特定資料庫(MySQL、PostgreSQL、Oracle)
效能影響可能影響 Django 應用的效能可能影響資料庫效能
Django SignalsDjango 應用層(Python)
SQL Triggers資料庫層(SQL)
Django SignalsModel 的 save() 或 delete()
SQL TriggersSQL 操作(INSERT、UPDATE、DELETE)
Django Signals發送郵件、觸發 API、日誌記錄
SQL Triggers修改數據、限制操作、計算欄位值
Django SignalsDjango ORM 內部
SQL Triggers整個資料庫,包括 Django 之外的操作
Django Signals與 Django 應用綁定
SQL Triggers依賴特定資料庫(MySQL、PostgreSQL、Oracle)
Django Signals可能影響 Django 應用的效能
SQL Triggers可能影響資料庫效能

何時該用 Django Signals,何時該用 SQL Triggers?

✅ 選擇 Django Signals

適用於 應用層邏輯:

  • 當 Model 變更時,需要執行非資料庫相關的操作
  • 當某個 Model 變更時,需要發送通知(Email、WebSocket)
  • 當用戶註冊時,自動創建 Profile

✅ 選擇 SQL Triggers

適用於 數據完整性維護:

  • 當數據變更時,需要自動修改數據
  • 當某個欄位更新時,必須自動計算新值
  • 需要確保某些操作不被執行(如防止刪除重要數據)

結語

Django Signals 和 SQL Triggers 雖然概念類似,但用途完全不同:

  • Django Signals 是應用層的事件處理機制,適用於業務邏輯(如發送郵件、通知、觸發 API)。
  • SQL Triggers 是資料庫層的自動執行機制,適用於確保數據完整性(如自動計算欄位值、限制刪除)。

如果你的需求與應用邏輯相關(如通知、外部 API),選擇 Django Signals。
如果你的需求與數據完整性相關(如數據驗證、自動計算欄位值),選擇 SQL Triggers。

透過這篇文章,希望你能夠清楚理解這兩者的關係與差異,並根據需求選擇最適合的解決方案!🚀

目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

資料庫

目錄

  • 什麼是 Django Signals?
  • Django Signals 的概念
  • Django Signals 的運作方式
  • Django Signals 的應用場景
  • 什麼是 SQL Triggers?
  • SQL 觸發器(Triggers)的概念
  • SQL 觸發器的運作方式
  • SQL 觸發器的應用場景
  • Django Signals vs SQL Triggers:主要差異
  • 何時該用 Django Signals,何時該用 SQL Triggers?
  • ✅ 選擇 Django Signals
  • ✅ 選擇 SQL Triggers
  • 結語