Cron-jobs med Postgres

https://github.com/citusdata/pg_cron is a simple cron-based job scheduler for PostgreSQL (10 or higher) that runs inside the database as an extension.

Cron-jobs er utrolig nyttige - specielt når vi har med tidsbaseret data at gøre. Her har vi mulighed for at lave snapshots, aggregeret data og meget mere ud fra en traditionel CRON struktur. Her kan I se et par eksempler på hvordan man bruger det!

-- Delete old data on Saturday at 3:30am (GMT)
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
 schedule
----------
       42

-- Vacuum every day at 10:00am (GMT)
SELECT cron.schedule('nightly-vacuum', '0 10 * * *', 'VACUUM');
 schedule
----------
       43

-- Change to vacuum at 3:00am (GMT)
SELECT cron.schedule('nightly-vacuum', '0 3 * * *', 'VACUUM');
 schedule
----------
       43

-- Stop scheduling jobs
SELECT cron.unschedule('nightly-vacuum' );
 unschedule 
------------
 t

SELECT cron.unschedule(42);
 unschedule
------------
          t

-- Vacuum every Sunday at 4:00am (GMT) in a database other than the one pg_cron is installed in
SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'some_other_database');
 schedule
----------
       44

-- Call a stored procedure every 5 seconds
SELECT cron.schedule('process-updates', '5 seconds', 'CALL process_updates()');

-- Process payroll at 12:00 of the last day of each month
SELECT cron.schedule('process-payroll', '0 12 $ * *', 'CALL process_payroll()');

Som I nok har set på vores eksempler er cron-syntaxen lidt speciel - der er et kort diagram på hvordan strukturen er her:

 ┌───────────── min (0 - 59)
 │ ┌────────────── hour (0 - 23)
 │ │ ┌─────────────── day of month (1 - 31) or last day of the month ($)
 │ │ │ ┌──────────────── month (1 - 12)
 │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to
 │ │ │ │ │                  Saturday, or use names; 7 is also Sunday)
 │ │ │ │ │
 │ │ │ │ │
 * * * * *

Vores cron-schedule brugger på tal som forklare i hvilke intervaller det skal køre også kaldet “kun på det her tidspunkt”, hvor man fylde ind med en * som betyder alle mulige tidspunkter!

Vil man lege med det kan det anbefales at bruge et hjælpeværktøj at designe det såsom https://crontab.guru/

For mere dokumentation se deres readme og guide på GitHub - https://github.com/citusdata/pg_cron?tab=readme-ov-file

Dette virker for resten også med vores favorit postgres udbyder Neon!