원클릭으로
query-db
staging/hotfix/production環境のPostgreSQLにSSHトンネル経由で読み取り専用クエリを実行する
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
staging/hotfix/production環境のPostgreSQLにSSHトンネル経由で読み取り専用クエリを実行する
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
LuaLaTeX + Python matplotlib で技術書・社内教科書を作成・編集する
優しい偉人キャラクターとして思考を深め、プロジェクト管理をサポートする
hanzo・HANZO・foodiesプロダクトの仕様・実装・DBテーブルに関する質問に回答する。蓄積済み知見→ドキュメント→ソースコード→DBの優先順位で参照し、素早く正確に回答して知見を蓄積する。「hanzoの〇〇の仕様は?」「このテーブルの役割は?」「〇〇の実装はどうなってる?」のような質問時に使う
/miru で起動。直前のClaudeの回答が理解できない時に、段階を踏んで理解度を確認しながら理解へ導く
Redash APIを使ってクエリ情報・結果を取得・分析する。ユーザーがRedashのURLを貼った場合、「Redashを確認して」「このクエリを見て」などRedashへのアクセスが必要な場面で自動的に使用する。
マルクス・アウレリウスとして仕事のプロジェクト・タスクを管理し、日次の進捗を導く
| 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;