こんにちは、バックエンドエンジニアの @akira です。
データを自動で更新するなど、 SQL を一定間隔で実行したいケースがあり、今回はその方法を調べてみました。
前提条件は以下です。
- PostgreSQL 9.3~
PGPASSWORD
やhost
,port
,username
,dbname
は省略- 以下の SQL を実行
update "Fruits" set updated_at = now() where id = '123';
bash
watch -n n COMMAND
で COMMAND を n 秒ごとに実行できます。
COMMAND 部分はダブルクオートで囲むこともできます。
watch -n 10 "ls -l" # 10秒ごとに ls -l を実行
上述のクエリを実行する場合は次のようになります。
watch -n 60 psql -c "update \"Fruits\" set updated_at = now() where id = '123';"
エスケープがちょっと辛いですね。
watch
の COMMAND 部分をダブルクオートで囲むと、さらに大変になりそうです。
psql
PostgreSQL 9.3 から \watch
メタコマンドが追加されました。12 系でも使えます。
QUERY; \watch n
で QUERY を n 秒ごとに実行できます。
先ほどのクエリを実行する場合は次のようになります。
update "Fruits" set updated_at = now() where id = '123'; \watch 60
エスケープ不要で、可読性も高いですね。
おまけ:redis-cli
redis-cli -r n -i s COMMAND
で COMMAND を s 秒間隔で n 回実行できるようです。
-i
を指定しない場合は即時実行のようですね。
参考:Continuously run the same command
さいごに
MySQL も少し調べてみたのですが、Event Scheduler で実行する方法しかヒットしませんでした(他にやり方をご存知でしたら是非教えてください🙏)。
「何かを実現したい」という意思がないと、上記のやり方を知る機会はなかったのかなと思っています(「30 分に一度、手動でコマンドを実行すればいいや」では決して調べることはなかったでしょう)。
業務でこのような機会を逃さずに、一つ一つ積み上げていきたいですね。
私たちテックチームでは「くらしのマーケット」を一緒に作る仲間を募集しています。
ぜひ コーポレートサイト までお気軽にご連絡ください!