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

Published February 25, 2025 by 徐培鈞
資料庫

在開發 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) 是資料庫中的一種自動執行機制,當特定事件(INSERTUPDATEDELETE)發生時,會自動執行一段 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 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

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