2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

本番DBで手作業しているSQLを、Django の管理画面の操作に置き換えたい

2
Last updated at Posted at 2026-10-19

はじめに

前回の記事では、条件に合うメンバーを新しいチャンネルにまとめて参加させるSQLを、読みやすく書き直しました。

この記事では、そのSQLを本番DBに対して手作業で実行している運用を、どう変えるかを考えます。

前回と同じく、業務の内容はサンプルの例に置き換えて説明します。社内チャットツールで新しいチャンネルを作ったときに、「ほぼすべてのチャンネルに参加している社員」をまとめて参加させる作業です。対象は、参加しているチャンネルが12個以上の有効なメンバーです。

結論として、Django の管理画面にアクションを追加する方法をチームに提案します。実装前の検討段階の内容です。

環境は次のとおりです。

  • アプリは Django
  • 本番は Amazon ECS(AWS Fargate)
  • DB は Amazon Aurora MySQL
  • リポジトリは GitHub の Team プランのプライベートリポジトリ
  • Django の管理画面のユーザーは、個人ごとに発行している

今の運用と課題

新しいチャンネルを作ると、依頼を受けたエンジニアが次の手順で作業しています。

image.png

  1. チャンネル名から、新しいチャンネルのIDを調べる
  2. 本番DBに接続し、確認用のSQLで対象の人数を数える
  3. 人数と登録用のSQLを、ほかのメンバーにレビューしてもらう
  4. 登録用のSQLを実行する
  5. 確認用のSQLをもう一度実行し、対象が0人になったことを確かめる
  6. 実行したSQLと人数を、Slack上に記録に残す

確認用と登録用のSQLは、チャンネルIDを手で書き換えてから実行します。書き換える箇所は、確認用のSQLに2か所、登録用のSQLに3か所あります。

この運用には、次の課題があると考えます。

  • IDの書き換えを間違えると、対象のメンバー全員が別のチャンネルに参加してしまう
  • 確認用と登録用のSQLを取り違えると、確認しないまま登録される
  • 誰がいつ実行したかを、手作業で記録している

考えた方法

どの方法も、対象を選んで登録する処理をSQLの手作業からアプリのコードに移す点は同じです。コードにすれば、レビューとテストは1度で済み、作業のたびにSQLを書き換える必要がなくなります。

その処理を動かす方法として、次の3つを比べました。

管理コマンド+GitHub Actions

処理を Django の管理コマンドにし、GitHub Actions から手動で実行します。

別の人の承認を必須にする GitHub の機能(Environment の required reviewers)は、Team プランのプライベートリポジトリでは使えません。

Slack アプリ

チームで使っている Slack のスラッシュコマンドからモーダルを開き、メンバーを参加させる新しいチャンネルを選びます。アプリが人数などの確認結果を Slack に投稿し、ほかのメンバーがそのメッセージのボタンを押したときだけ登録されます。

その分、Slack からのリクエストを受け取るエンドポイントや DB への経路など、作るものが多くなります。

管理画面のアクション

Django の管理画面でチャンネルを選んでアクションを実行し、確認ページで人数を確かめてから登録します。AWS や GitHub の設定は必要ありません。

一方で、レビューを受けずに「参加させる」を押すこともできてしまいます。

比較と提案

3つの方法を、新しく作るもの、ミスの防ぎやすさ、別の人のレビュー、実行の記録の観点で比べました。

管理コマンド+Actions Slack アプリ 管理画面のアクション
新しく作るもの 管理コマンド、ワークフロー、この作業用の AWS の権限(IAM ロール) Slack アプリ、モーダルとメッセージの処理、エンドポイント、DB への経路 アクションと確認ページ
IDの入力ミス 入力するので、照合が必要 モーダルで選ぶので入力しない 一覧から選ぶので入力しない
確認と登録の取り違え 人数を入力させて照合すれば防げる 確認結果のボタンからしか登録できない 確認ページからしか登録できない
別の人のレビュー ルールで守る(レビューなしでも実行できる) ほかのメンバーが許可しないと登録されない仕組みにできる ルールで守る(レビューなしでも押せる)
実行の記録 Actions の実行履歴(ログの保存期間は既定で90日) Slack のメッセージ 管理画面の変更履歴(DB に残る)

この比較から、管理画面のアクションを提案します。理由は次の3つです。

  • IDを入力せずに一覧から選べて、確認ページを通らないと登録できない
  • 新しく作るものが最も少なく、AWS と GitHub の設定を変えない
  • 誰がいつ実行したかが、変更履歴に残る

提案する管理画面のアクション

今の作業手順と比べると、次のように変わります。

image.png

人が操作するのは3つの手順になり、記録は自動で行います。レビューを残すかどうかは、後で述べるとおりチームで相談します。

操作の流れは次のとおりです。画像は画面のイメージです。

  1. チャンネル一覧で新しいチャンネルを1件選び、「対象のメンバーを一括で参加させる」を実行する
  2. 確認ページに、チャンネル名と対象の人数が表示される
  3. チャンネル名と人数が依頼どおりかを確かめて、「参加させる」を押す
  4. 登録した内容が、そのチャンネルの変更履歴に残る

チャンネル一覧で新しいチャンネルを選び、アクションを実行する画面です。

image.png

チャンネル名と対象の人数を表示する、確認ページです。

image.png

ミスを防ぐ仕組み

確認ページを通らないと登録できないようにする
アクションを実行しても、確認ページを開くだけにします。登録は確認ページの「参加させる」からしか行えないので、確認と登録を取り違えることがなくなります。

使える人を絞る
特定のグループの人だけにアクションを表示するようにします。確認ページでも同じ判定をして、URLを直接開いても使えないようにします。

失敗したらすべて取り消す
登録を1つのトランザクションにまとめ、1人分でも登録に失敗したら、その回の登録をすべて取り消します。一部のメンバーだけが参加した状態にはなりません。

誰がいつ実行したかを残す
登録した内容を、そのチャンネルの変更履歴に記録します。管理画面のユーザーは個人ごとなので、誰がいつ何人を参加させたかを、手作業なしで確認できます。

実行した人と日時、参加させた人数が記録された、チャンネルの変更履歴の画面です。

image.png

ここまでの4つの仕組みは、Django の管理画面の標準機能(アクション、独自のページの追加、権限の判定、変更履歴)を組み合わせて作れる見込みです。

レビューは必要か

今の運用でレビューが必要なのは、SQLを毎回手で書き換えるため、IDの書き間違いや、確認用と登録用の取り違えが起こる可能性があるからです。管理画面のアクションではこの2つが起きないので、毎回のレビューはなくてもよいと考えています。

残るのは、チャンネルを選び間違えたときと、人数がいつもと大きく違うときです。どちらも確認ページにチャンネル名と人数が出るので、実行する本人が確かめられます。

気になるのは、間違えて登録したときの取り消しは手作業になります。レビューを残すかどうかは、この手間も含めてチームで相談します。

導入にあたって考えておくこと

  • 間違えて登録したときは、手作業のSQLで取り消す(そのため、追加したメンバーのIDを登録の処理でログに出力しておく)
  • 管理画面から本番データを一括で変更できるようになるため、このアクションを誰が使えるようにするかを考える必要がある(たとえば、専用のグループを作り、使う人だけを入れるなど)

おわりに

この作業は毎日行うものではないため、作るのに手間をかけすぎず、手作業のミスは防げる方法を選びたいと考えていました。そこで、Django の管理画面のアクションを選びました。

チームに提案するときは、次の点を相談して決めたいです。

  • アクションを、依頼した PM が自分で使えるようにするか、これまでどおりエンジニアだけが使うか
  • 確認ページのレビューを残すか、残すならどこで誰が行うか

提案が採用されて実装まで進んだら、結果を記事にできたらいいなと思います!

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?