Loading...

2023-11-27(月) 15:00

🗓 Supabaseでpg_cronを䜿っおスケゞュヌル実行する

Supabasepg_cron
Supabaseの拡匵機胜にあるpg_cronを䜿甚しお、Database Functionを指定したスケゞュヌルや定期実行する方法を解説したす。

目次

前提ず泚意事項

  • Supabase アカりントを䜜成枈みであるこず
  • Supabase のプロゞェクトを䜜成枈みであるこず

この蚘事では以䞋の公匏ドキュメントを参考にしたす。

pg_cron: Job Scheduling

The pg_cron extension is a simple cron-based job scheduler for PostgreSQL that runs inside the database.

supabase.com

この蚘事のゎヌル

任意の Supabase Database Function を決たった日時に定期実行できるようにするこずがこの蚘事のゎヌルです。

pg_cron を有効化する

たずはじめに、Supabase でpc_cronを䜿えるようにするために有効化する必芁がありたす。 以䞋のように Supabase の Web 管理画面のサむドメニュヌにある「Database」ペヌゞの「Extensions」ペヌゞで、pg_cronず怜玢したす。そしお以䞋のように衚瀺されたpg_cronのスむッチを ON にしたす。

Supabaseのpg_cron拡匵機胜

ON にするず以䞋のように確認ダむアログが開くので、Enable extensionボタンをクリックしたす。
Select a schema to enable the extension forに぀いおは、extensionを遞択したす。

Supabaseのpg_cronを有効化する

以䞋のように ON になりたした。これでスケゞュヌルを定期的に実行するためのpg_cronを Supabase 内で䜿甚できるようになりたす。

pg_cronの有効化完了

以䞊でpg_cronの有効化が完了です。

スケゞュヌルを登録する Database Function

テスト甚に以䞋のようなhello worldず衚瀺するだけの Database Function をhello_world()ずいう名前で Supabase の Web 管理画面にあるSQL Editorで䜜成しおおきたす。

hello_world Database Function
create or replace function hello_world()
returns text
language sql
as $$
  select 'hello world';
$$;

そしお同様にSQL Editorで以䞋のような Database Function 䜜成し、Runをクリックしお実行したす。

Database Functionを実行する

䞊蚘では、以䞋のようにcron.scheduleを䜿甚しお、hello_worldずいう Database Function を毎日 13:30 に実行するように登録しおいたす。

スケゞュヌル登録するためのDatabase Function
select
  cron.schedule(
    'invoke-hello-world', -- スケゞュヌル名
    '30 4 * * *', -- 毎日13:30に実行する
    $$
    select hello_world(); -- 実行する内容
    $$
  );

実行するず画像にあるようにcron.scheduleの実行結果ずしお登録したスケゞュヌルの ID䞊蚘画像内だず8が衚瀺されたす。
これでスケゞュヌル登録が完了し、毎日 13:30 にhello_worldずいう Database Function が実行されるようになりたす。

なお、もし以䞋のようにschema "cron" does not existずいう゚ラヌが衚瀺される堎合は、pg_cronが有効になっおいないために発生したす。再床pg_cronが有効になっおいるず確認するず良いかもしれたせん。

pg_cronが有効になっおいない堎合の゚ラヌ

䜜成枈みのスケゞュヌル䞀芧を確認する

以䞋の Database Function を実行するこずで、䜜成枈みのスケゞュヌルゞョブ䞀芧を確認できたす。

䜜成枈みのスケゞュヌル䞀芧を確認する
select * from cron.job;

以䞋が Supabase の Web 管理画面で䞊蚘のク゚リを実行した䟋です。

䜜成枈みのスケゞュヌル䞀芧

なお、以䞋のように Supabase の Web 管理画面にある Table Editor でも同様にスケゞュヌルゞョブを確認できたす。pg_cronで䜜成したスケゞュヌルゞョブはjob、実行したスケゞュヌルゞョブの履歎はjob_run_detailsで確認できたす。なお、いずれもcronスキヌマの䞭にありたす。

䜜成枈みのスケゞュヌル䞀芧

䜜成枈みのスケゞュヌルを曎新する

蚘事公開時点では、スケゞュヌル名が同じcron.scheduleを再床実行すれば新しい内容で曎新されたす。

スケゞュヌルを曎新する
select
  cron.schedule(
    'invoke-hello-world',
    '0 10 * * *', -- 毎日19時に実行する
    $$
    select hello_world();
    $$
  );

なお、スケゞュヌルの曎新にはalter_jobを䜿甚するこずもできたす。 䟋えば、以䞋はalter_jobを䜿甚しおスケゞュヌルのみを曎新しおいたす。

alter_jobを䜿ったスケゞュヌルゞョブの曎新
select cron.alter_job(
  job_id := (select jobid from cron.job where jobname = 'invoke-hello-world'),
  '0 10 * * *', -- 毎日19時に実行する
);

䞊蚘では,job_idずしおselect jobid from cron.job where jobname = 'invoke-hello-world'の倀を䜿っおいたすが、これは単玔にinvoke-hello-worldずいう名前のスケゞュヌルの ID を取埗しおいたす。 もし目的のjob_idがわかっおいる堎合は、そのたたその倀を枡しお OK です。 そしおスケゞュヌルゞョブの曎新ずしおはalter_jobが本来の方法で、alter_jobの方がより现かい蚭定を曎新するこずができたす。 䟋えば、alter_jobでは以䞋の内容を線集するこずができたす。

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
)

詳しくは以䞋の公匏ドキュメントに蚘茉されおいたす。

Edit job

Edit job

supabase.com

スケゞュヌルを䞀時停止/再開する

alter_jobを䜿甚するこずで、䜜成枈みのスケゞュヌルゞョブを䞀時停止するこずできたす。
以䞋のようにactiveにfalseを指定するこずで、スケゞュヌルゞョブを䞀時停止するこずができたす。

alter_jobを䜿ったスケゞュヌルゞョブの䞀時停止
select cron.alter_job(
  job_id := (select jobid from cron.job where jobname = 'invoke-hello-world'),
  active := false
);

再床スケゞュヌルゞョブを再開する堎合は、以䞋のようにactiveにtrueを指定するこずで、スケゞュヌルゞョブを再開するこずができたす。

alter_jobを䜿ったスケゞュヌルゞョブの再開
select cron.alter_job(
  job_id := (select jobid from cron.job where jobname = 'invoke-hello-world'),
  active := true
);

スケゞュヌルを削陀する

以䞋のク゚リを実行するこずで登録したスケゞュヌルを削陀できたす。

スケゞュヌルゞョブの削陀
select cron.unschedule('invoke-hello-world');

䞊蚘を実行埌、再床select * from cron.job;を実行しおみるず、削陀されおいるこずを確認できるず思いたす。

たずめ

この蚘事では、hello worldを衚瀺するだけの Database Function をスケゞュヌル実行したため、実甚性はありたせんが、hello_world()の代わりに他の奜きな Databse Function を実行できたす。
そのため Supabase の䞭で奜きな凊理をスケゞュヌル実行ができ、䟋えば毎日時に特定のテヌブルのデヌタを䞀掃したり、デむリヌレポヌトやメヌルマガゞンのような内容を毎日決たった時間にメヌルを送信したりなど色々なこずができるようになりたす。