くらしのマーケット開発ブログ

猫のいる会社、みんなのマーケットの技術ブログ

SQL を一定間隔で実行する

夜ご飯んンンンンンンンンンンンンンンッ!食べれないやつ😐
夜ご飯んンンンンンンンンンンンンンンッ!食べれないやつ😐

こんにちは、バックエンドエンジニアの @akira です。
データを自動で更新するなど、 SQL を一定間隔で実行したいケースがあり、今回はその方法を調べてみました。

前提条件は以下です。

  • PostgreSQL 9.3~
  • PGPASSWORDhost, 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 系でも使えます。

参考:\watch [ seconds ]

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 分に一度、手動でコマンドを実行すればいいや」では決して調べることはなかったでしょう)。

業務でこのような機会を逃さずに、一つ一つ積み上げていきたいですね。

私たちテックチームでは「くらしのマーケット」を一緒に作る仲間を募集しています。
ぜひ コーポレートサイト までお気軽にご連絡ください!