with one click
query-db
staging/hotfix/production環境のPostgreSQLにSSHトンネル経由で読み取り専用クエリを実行する
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
staging/hotfix/production環境のPostgreSQLにSSHトンネル経由で読み取り専用クエリを実行する
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
| name | query-db |
| description | staging/hotfix/production環境のPostgreSQLにSSHトンネル経由で読み取り専用クエリを実行する |
| disable-model-invocation | false |
staging / hotfix / production 環境のPostgreSQLデータベースに対してクエリを実行する。
クエリを1回実行するたびに、必ず以下の順序を守る。SSHトンネル・パスワードが既に揃っていて接続手順(1〜5)を省略できる場合でも、このルールは省略できない。
調査のために複数回試行する場合も、各回でこの順序を守る(まとめて最後に一括表示しない)。「調査の途中経過だから」「軽い確認クエリだから」は省略の理由にならない。
| 項目 | 値 |
|---|---|
| Host | localhost |
| Port | 5432 |
| User | table_plus |
| Password | ユーザーに確認 |
| Database | foodies |
ユーザーに接続する環境を確認する:
「どの環境に接続しますか?(staging / hotfix / production)」
aws sso login --profile goals-hanzo
lsof -iTCP:5432 -sTCP:LISTEN
未接続の場合はバックグラウンドで起動する。環境に応じて以下のコマンドを使用:
ssh -f -N \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=3 \
-L 5432:database.staging.internal.foodies.jp:5432 \
-i ~/.ssh/minedup.pem \
-p 22 ec2-user@staging.bastion.hanzo.cloud
ssh -f -N \
-L 5432:database.hotfix.internal.foodies.jp:5432 \
-i ~/.ssh/minedup.pem \
-p 22 ec2-user@hotfix.bastion.hanzo.cloud
ssh -f -N \
-L 5432:readerdatabase.production.internal.foodies.jp:5432 \
-i ~/.ssh/minedup.pem \
-p 22 ec2-user@production.bastion.hanzo.cloud
ユーザーにデータベースのパスワードを確認する(「DBのパスワードを教えてください(いつものやつです)」)。
PGPASSWORD=<パスワード> psql -h localhost -p 5432 -U table_plus -d foodies -c "SELECT 1;"
| エラー | 対処 |
|---|---|
| SSO認証エラー | aws sso login --profile goals-hanzo を再実行 |
| SSHトンネル接続失敗 | AWS SSOの有効期限切れの可能性。SSO再ログイン後にリトライ |
| psql接続失敗 | トンネルが起動しているか lsof -iTCP:5432 で確認 |
冒頭の「最重要ルール(クエリ実行の順序)」を必ず守る(説明→SQL提示→実行→結果表示。結果は目安10行程度、それ以上ある場合は全体件数を添える)。
PGPASSWORD=<パスワード> psql -h localhost -p 5432 -U table_plus -d foodies -c "<SQL文>"
# テーブル一覧
PGPASSWORD=<パスワード> psql -h localhost -p 5432 -U table_plus -d foodies -c "\dt"
# shopsテーブルの先頭5件
PGPASSWORD=<パスワード> psql -h localhost -p 5432 -U table_plus -d foodies -c "SELECT * FROM shops LIMIT 5;"
# レコード数カウント
PGPASSWORD=<パスワード> psql -h localhost -p 5432 -U table_plus -d foodies -c "SELECT COUNT(*) FROM shops;"
作業完了後、SSHトンネルを終了する場合:
# SSHトンネルのプロセスを確認
lsof -i :5432
# プロセスを終了
kill <PID>
複数の食材・店舗・日付などを対象にするクエリは、必ずサブクエリでLIMITをかけてから結合すること。 本番データは大量のため、絞らずにJOINすると非常に重くなる。
-- NG: そのままJOINすると全件スキャンで重い
SELECT * FROM orders
LEFT JOIN order_items ON orders.id = order_items.order_id
LEFT JOIN shops ON orders.shop_id = shops.id;
-- OK: ベーステーブルをLIMITで絞ってからJOIN
SELECT *
FROM (SELECT * FROM orders LIMIT 100) AS o
LEFT JOIN order_items ON o.id = order_items.order_id
LEFT JOIN shops ON o.shop_id = shops.id;
-- 特定の店舗IDや日付範囲で絞ってからJOIN
SELECT *
FROM (
SELECT * FROM orders
WHERE shop_id IN (1, 2, 3)
AND created_at >= '2024-01-01'
LIMIT 50
) AS o
LEFT JOIN order_items ON o.id = order_items.order_id;
-- ingredientsをLIMITで絞って関連データを取得
SELECT *
FROM (SELECT * FROM ingredients LIMIT 20) AS i
LEFT JOIN dish_ingredients ON i.id = dish_ingredients.ingredient_id
LEFT JOIN dishes ON dish_ingredients.dish_id = dishes.id;
-- クエリの実行計画を確認
EXPLAIN ANALYZE
SELECT * FROM (SELECT * FROM shops LIMIT 10) AS s
LEFT JOIN orders ON s.id = orders.shop_id;
LuaLaTeX + Python matplotlib で技術書・社内教科書を作成・編集する
優しい偉人キャラクターとして思考を深め、プロジェクト管理をサポートする
hanzo・HANZO・foodiesプロダクトの仕様・実装・DBテーブルに関する質問に回答する。蓄積済み知見→ドキュメント→ソースコード→DBの優先順位で参照し、素早く正確に回答して知見を蓄積する。「hanzoの〇〇の仕様は?」「このテーブルの役割は?」「〇〇の実装はどうなってる?」のような質問時に使う
/miru で起動。直前のClaudeの回答が理解できない時に、段階を踏んで理解度を確認しながら理解へ導く
Redash APIを使ってクエリ情報・結果を取得・分析する。ユーザーがRedashのURLを貼った場合、「Redashを確認して」「このクエリを見て」などRedashへのアクセスが必要な場面で自動的に使用する。
マルクス・アウレリウスとして仕事のプロジェクト・タスクを管理し、日次の進捗を導く