
Supabase 如何用 pg_cron 與 pg_net 定時調用 Edge Functions【免費下載鏈接】supabaseThe Postgres development platform. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications.項目地址: https://gitcode.com/GitHub_Trending/supa/supabase如果你的 Edge Function 需要被周期性地觸發——比如每分鐘執行一次數據同步、定期清理或定時調用外部服務——在托管版 Supabase Platform 上可以用 Postgres 自帶的調度能力完成pg_cron擴展按 cron 表達式觸發任務pg_net擴展負責在 SQL 中發出異步 HTTP 請求兩者組合后數據庫就能按計劃向你的 Edge Function 發 POST 請求。官方指南 Scheduling Edge Functions 給出的完整路徑是啟用兩個擴展 → 把項目 URL 和 publishable key 存進 Supabase Vault → 用cron.schedule()注冊一個每周期調用net.http_post()的任務 → 通過運行記錄表驗證請求確實發出。前提條件該方案適用于托管的 Supabase Platformpg_cron是該平臺支持的 Postgres 擴展。啟用 pg_cron 與 pg_net兩個擴展都必須啟用。pg_cron在 Dashboard 的 Integrations 下找到 Cron Postgres Module啟用pg_cron擴展。也可以用 SQL 完成create extension pg_cron with schema pg_catalog; grant usage on schema cron to postgres; grant all privileges on all tables in schema cron to postgres;pg_net在 Dashboard 的 Database 頁面點擊側邊欄Extensions搜索 pg_net 并啟用。SQL 等價寫法create extension pg_net with schema extensions;文檔特別說明了 schema 的選擇原因擴展會自建名為net的 schema注冊到extensionsschema 可以避免暴露到public同時滿足 Security Advisor 檢查。注意文檔中有一處明確警告pg_net API 目前處于 beta 階段函數簽名可能變化。在 Vault 中保存項目 URL 與 publishable key調用 Edge Function 需要項目 URL 和 publishable key。文檔推薦把這兩項存在 Supabase Vault 里避免把密鑰明文寫進任務 SQL。Vault 是 Postgres 擴展加 Dashboard UI密鑰在磁盤上以認證加密形式存儲SQL 通過視圖vault.decrypted_secrets按需解密讀取。vault.create_secret()接受 secret 值、可選的唯一名稱和可選描述。按 Scheduling Edge Functions 的示例創建兩個具名 secretselect vault.create_secret(https://project-ref.supabase.co, project_url); select vault.create_secret(YOUR_SUPABASE_PUBLISHABLE_KEY, publishable_key);其中https://project-ref.supabase.co是文檔中的占位寫法替換為你自己項目的公開 URLYOUR_SUPABASE_PUBLISHABLE_KEY替換為你項目的 publishable key。函數會返回新 secret 的 UUID。后續任務 SQL 通過名稱讀取解密值select decrypted_secret from vault.decrypted_secrets where name project_url;文檔同時提醒任何能訪問vault.decrypted_secrets視圖的角色都能拿到明文密鑰要始終用合適的 SQL 權限保護這個視圖。創建定時任務先說 cron 語法任務調度基于標準的五位 cron 表達式┌───────────── min (0 - 59) │ ┌────────────── hour (0 - 23) │ │ ┌─────────────── day of month (1 - 31) │ │ │ ┌──────────────── month (1 - 12) │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to │ │ │ │ │ Saturday, or use names; 7 is also Sunday) │ │ │ │ │ * * * * *Quickstart 里有兩個關于任務名的硬性說明任務名區分大小寫且創建后不可編輯用相同的名字再次創建任務會覆蓋upsert已有任務所以命名要一次到位。主路徑每分鐘調用一次 Edge Function密鑰來自 Vaultselect cron.schedule( invoke-function-every-minute, * * * * *, -- every minute $$ select net.http_post( url: (select decrypted_secret from vault.decrypted_secrets where name project_url) || /functions/v1/function-name, headers:jsonb_build_object( Content-type, application/json, apikey, (select decrypted_secret from vault.decrypted_secrets where name publishable_key) ), body:concat({time: , now(), })::jsonb ) as request_id; $$ );執行前需要替換的部分function-name是你的 Edge Function 的 slugVault 中的project_url、publishable_key按上一步寫入的實際值生效。URL 拼接后形如https://你的項目/functions/v1/你的函數請求頭帶上Content-type: application/json和apikey請求體是包含當前時間戳的 JSON。可選分支更短周期30 秒Quickstart 里給出了一個更簡單的 30 秒示例URL 和 key 直接內聯在 SQL 中select cron.schedule( invoke-function-every-half-minute, 30 seconds, $$ select net.http_post( url:https://project-ref.supabase.co/functions/v1/function-name, headers:jsonb_build_object(Content-Type,application/json, apikey, YOUR_PUBLISHABLE_KEY), body:jsonb_build_object(time, now() ), timeout_milliseconds:5000 ) as request_id; $$ );兩個使用限制需要注意使用秒級調度如30 seconds要求 Postgres 版本在 15.1.1.61 或更高key 內聯在任務 SQL 中可讀文檔因此推薦優先使用 Vault 方案。timeout_milliseconds:5000表示請求超過 5000 毫秒即取消net.http_post默認超時是 2000 毫秒。驗證任務與請求是否執行驗證分兩層任務本身有沒有按計劃跑以及 HTTP 請求有沒有發出并返回。任務運行記錄來自 Cron Quickstartselect * from cron.job_run_details where jobid (select jobid from cron.job where jobname invoke-function-every-minute) order by start_time desc limit 10;也可以在 Dashboard 的 Jobs 頁面找到對應任務點擊History按鈕查看。pg_net 請求與響應。pg_net 的機制是等待中的請求存放在net.http_request_queue表執行后被刪除HTTP 請求要等事務提交后才真正開始發出。響應默認在net._http_response表中保留 6 小時可用以下查詢觀察select * from net._http_response;專門排查失敗請求狀態碼 400 或帶有錯誤信息select * from net._http_response where status_code 400 or error_msg is not null order by created desc;net._http_response的列包括id對應request_id、status_code、content、timed_out、error_msg、created等所以拿到request_id后可以按 id 定位具體某次調用的返回內容。修改、停用與刪除任務修改調度周期用cron.alter_job()按任務名先查出jobidselect cron.alter_job( job_id : (select jobid from cron.job where jobname invoke-function-every-minute), schedule : */5 * * * * );cron.alter_job()的完整參數cron.alter_job( job_id bigint, schedule text default null, command text default null, database text default null, username text default null, active boolean default null )另外用相同任務名再次調用cron.schedule()也會通過 upsert 替換已有任務。停用/啟用-- Activate Job select cron.alter_job( job_id : (select jobid from cron.job where jobname invoke-function-every-minute), active : true ); -- Deactivate Job select cron.alter_job( job_id : (select jobid from cron.job where jobname invoke-function-every-minute), active : false );刪除任務select cron.unschedule(invoke-function-every-minute);文檔明確警告unschedule 會永久刪除cron.job中的任務記錄但運行歷史仍保留在cron.job_run_details表中且這些記錄不會自動清理也會長期占用數據庫磁盤空間。限制條件來自 pg_net 文檔 的邊界直接影響方案可用性pg_net API 處于 beta函數簽名可能變化只支持 POST 請求且請求體必須是 JSON不支持 PATCH/PUT也不支持其他數據格式擴展按最高 200 請求/秒的速率配置超速率運行可能引入不穩定同一時間只對接一個數據庫默認是postgres庫請求和響應存放在 unlogged table 中數據庫崩潰或非正常關閉時不保留響應數據默認只保存 6 小時pg_net的默認行為如 TTL若要調整需 pg_net v0.12.0 以上且必須在系統級修改配置并重啟后臺 worker改配置需要相應權限文檔示例grant alter system on parameter pg_net.ttl to postgres;后alter system set pg_net.ttl to 24 hours;再select net.worker_restart();。如果你的調用場景不是周期性觸發而是數據變更時通知外部服務pg_net 也可以直接放在 trigger 里使用這與本文的定時調度是兩條獨立的路徑。相關文檔Scheduling Edge Functions、Cron Quickstart、Cron Install、pg_net 擴展、Vault。【免費下載鏈接】supabaseThe Postgres development platform. Supabase gives you a dedicated Postgres database to build your web, mobile, and AI applications.項目地址: https://gitcode.com/GitHub_Trending/supa/supabase創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考