SQLite State
當一個週期性任務必須記住它已經做過的事 —— 哪些項目已發送過警示、最後處理的游標位置 —— 以避免在下一次觸發時重複通知或重新抓取時,請使用此技能。一個標準的 SQLite 檔案即可提供持久的、檔案鎖定的狀態,無需伺服器也無需額外的依賴。
何時使用
- 使用者說:「不要重複警示相同內容」、「跨次去重」、「記住最後的 ID」、「從中斷處繼續」。
- 對話中的程式碼是 cron/排程腳本,且目前在每次執行時都會重新處理所有內容。
何時不使用
- 狀態很小且僅在單次執行中短暫存在 —— 普通的 set/dict 就夠了。
- 需要多台機器同時共享狀態;應使用真正的伺服器資料庫而非單一檔案。
具體範例
使用者輸入:
我的新聞爬蟲每小時重複發送相同的新聞標題。讓它只發送新的。
輸出:
from state import filter_new, mark_seen
db = "news.db"
fresh = filter_new(db, [a["url"] for a in articles]) # 只保留未見過的 URL
for url in fresh:
send_alert(url)
mark_seen(db, *fresh) # 記住它們以供下次執行使用
應用的模式
- 每個項目應使用穩定且唯一的鍵(URL、ID、內容雜湊),而非陣列位置。
- 使用
filter_new決定要對哪些項目進行操作,然後只在操作成功後才呼叫mark_seen。 - 使用具名游標(
set_cursor/get_cursor)記錄進度,讓可恢復的爬蟲能從中斷處重新開始。 - 啟用 WAL 模式以支援持久的寫入與並行讀取;保持只有一個寫入者。
- 備份或進行版本管理的單一
.db檔案 —— 它就是整個任務的記憶。
參考文件:assets/state.py。
來源
萃取自作者在生產環境中跨多個自動化專案的使用經驗。v1.0.0。 另見:[[pipeline-orchestrator]]、[[cron-dispatch]]、[[webhook-receiver]]。
→ 使用 Trawlkit 建構完整的可執行機器人。