🚀

ShuttleでDiscord Bot Serenity+PostgreSQL

2024/01/10に公開

TL;DR

  • 主機能の詳しい解説はしないです 参考↓

https://zenn.dev/ahoxa1rx/articles/cd00fe8a063936

  • 拡張機能としてユーザーごとに返答するURLを変える機能
    • そのためにDBでモードを保存できるようにした

ShuttleでDBを使う方法

https://docs.shuttle.rs/resources/shuttle-shared-db

大体は↑に従ってください。

  • Cargo.tomlに依存を追加
  • データベーススキーマを作る
  • データベース操作関数を作る
  • main関数の引数を追加

という感じです。

https://github.com/raiga0310/vxbot_shuttle/blob/main/src/main.rs#L104

挿入について

INSERTやUPDATEのようなライト(Write)処理は、トランザクションブロックを作りましょう。
トランザクションブロックを作ると、なんらかDB操作で失敗した場合、BEGINした直前までDBの状態をロールバックしてくれます。

デプロイ時の設定について

なにもしなくていいです
ない場合と同じようにcargo shuttle deployで問題ないです。

動いている所

Repo

https://github.com/raiga0310/vxbot_shuttle

苦戦した所

  • sqlxのクエリの使い方思い出すのに苦戦した。(作ってる途中でマクロに気づいたが、面倒になってしなかった)
  • トランザクション作るの忘れてログと2日たたかってた
    • トランザクションの場合渡すのはDerefするといい感じ(ふわふわ理解)
  • ログだいじ
  • これはリサーチ不足だったのですが、ShuttleはSerenityのバージョンをデフォルトで現在0.11.*をサポートしているので、0.12にSerenityのバージョンをあげると破壊的変更に巻き込まれて時間が溶けます

参考にした記事

sqlx+PostgresSQLの挿入でのトランザクションはここを参考にした

https://zenn.dev/collabostyle/articles/ec055835386e77

微妙なところ

簡単なコマンドパースしか考えてないから脳死で正規表現組んでるのclapとかを使うべきなのかなとか
SerenityにはGroupという概念があり関数名そのままプレフィックス+コマンド名でコマンド登録できたりするんだけどShuttleのサンプル的にそのGroupを使っていない(なぜかは知らん)

変更ログ(2024年1月11日時点)

変更ログを追加
参考記事とか微妙な所を追加

Discussion