Open1

【PostgreSQL】CLIチートシート📝

まさぴょん🐱まさぴょん🐱

PostgreSQL CLI コマンドチートシート 📝

基本接続 🔗

データベース接続

# 基本接続
psql -h ホスト名 -p ポート番号 -U ユーザー名 -d データベース名

# ローカル接続
psql -U postgres
psql -d mydb

# 特定のホストに接続
psql -h localhost -U myuser -d mydb

# パスワード入力を求める
psql -U myuser -d mydb -W

# 接続文字列で接続
psql "postgresql://username:password@host:port/database"

基本操作

-- ヘルプ表示
\?

-- 現在の接続情報表示
\conninfo

-- データベース切り替え
\c データベース名

-- 終了
\q

データベース操作 🗄️

データベース一覧・作成・削除

-- データベース一覧
\l
\list

-- データベース作成
CREATE DATABASE database_name;
CREATE DATABASE mydb WITH OWNER myuser ENCODING 'UTF8';

-- データベース削除
DROP DATABASE database_name;

-- データベース情報表示
\l database_name

テーブル操作 📊

テーブル一覧・構造確認

-- テーブル一覧
\dt
\dt+  -- 詳細情報付き

-- 特定のスキーマのテーブル
\dt schema_name.*

-- テーブル構造表示
\d table_name
\d+ table_name  -- より詳細

-- カラム情報
\d+ table_name

テーブル作成・変更・削除

-- テーブル作成
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- カラム追加
ALTER TABLE users ADD COLUMN age INTEGER;

-- カラム変更
ALTER TABLE users ALTER COLUMN age TYPE SMALLINT;

-- カラム削除
ALTER TABLE users DROP COLUMN age;

-- テーブル名変更
ALTER TABLE users RENAME TO customers;

-- テーブル削除
DROP TABLE table_name;

データ操作 📝

データ挿入・更新・削除

-- データ挿入
INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com');

-- 複数行挿入
INSERT INTO users (name, email) VALUES
    ('Alice', 'alice@example.com'),
    ('Bob', 'bob@example.com');

-- データ更新
UPDATE users SET email = 'newemail@example.com' WHERE id = 1;

-- データ削除
DELETE FROM users WHERE id = 1;

-- 全データ削除
TRUNCATE TABLE users;

データ検索

-- 基本検索
SELECT * FROM users;
SELECT name, email FROM users;

-- 条件付き検索
SELECT * FROM users WHERE age > 25;
SELECT * FROM users WHERE name LIKE 'J%';

-- ソート
SELECT * FROM users ORDER BY created_at DESC;

-- 制限
SELECT * FROM users LIMIT 10 OFFSET 20;

-- グループ化
SELECT COUNT(*), age FROM users GROUP BY age;

インデックス操作 🚀

-- インデックス一覧
\di

-- インデックス作成
CREATE INDEX idx_users_email ON users(email);
CREATE UNIQUE INDEX idx_users_username ON users(username);

-- 複合インデックス
CREATE INDEX idx_users_name_age ON users(name, age);

-- インデックス削除
DROP INDEX idx_users_email;

-- インデックス使用状況確認
SELECT * FROM pg_stat_user_indexes;

ユーザー・権限管理 👥

ユーザー操作

-- ユーザー一覧
\du

-- ユーザー作成
CREATE USER username WITH PASSWORD 'password';
CREATE ROLE username WITH LOGIN PASSWORD 'password';

-- ユーザー削除
DROP USER username;

-- パスワード変更
ALTER USER username WITH PASSWORD 'newpassword';

-- 権限付与
GRANT ALL PRIVILEGES ON DATABASE mydb TO username;
GRANT SELECT, INSERT ON users TO username;

-- 権限剥奪
REVOKE ALL ON DATABASE mydb FROM username;

スキーマ操作 📋

-- スキーマ一覧
\dn

-- スキーマ作成
CREATE SCHEMA schema_name;

-- スキーマ削除
DROP SCHEMA schema_name CASCADE;

-- 現在のスキーマ確認
SHOW search_path;

-- スキーマパス設定
SET search_path TO schema_name, public;

バックアップ・リストア 💾

pg_dump(バックアップ)

# データベース全体をバックアップ
pg_dump -U username -h hostname database_name > backup.sql

# 圧縮バックアップ
pg_dump -U username -h hostname -F c database_name > backup.dump

# 特定のテーブルのみ
pg_dump -U username -t table_name database_name > table_backup.sql

# スキーマのみ
pg_dump -U username -s database_name > schema_only.sql

# データのみ
pg_dump -U username -a database_name > data_only.sql

リストア

# SQLファイルからリストア
psql -U username -d database_name < backup.sql

# カスタムフォーマットからリストア
pg_restore -U username -d database_name backup.dump

# 新しいデータベースを作成してリストア
createdb -U username new_database
pg_restore -U username -d new_database backup.dump

システム情報・監視 📊

データベース情報

-- データベースサイズ
SELECT pg_size_pretty(pg_database_size('database_name'));

-- テーブルサイズ
SELECT pg_size_pretty(pg_total_relation_size('table_name'));

-- 現在の接続数
SELECT count(*) FROM pg_stat_activity;

-- アクティブなクエリ
SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';

-- バージョン確認
SELECT version();

-- 設定確認
SHOW all;
SHOW shared_preload_libraries;

統計情報

-- テーブル統計
SELECT * FROM pg_stat_user_tables;

-- インデックス統計
SELECT * FROM pg_stat_user_indexes;

-- 実行計画
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';

役立つ psql コマンド 🛠️

メタコマンド

-- 時間表示
\timing

-- 拡張表示モード
\x

-- ページャー無効化
\pset pager off

-- 出力フォーマット変更
\pset format csv
\pset format html

-- ファイルに出力
\o output.txt
SELECT * FROM users;
\o

-- SQLファイル実行
\i script.sql

-- 変数設定・使用
\set myvar 'value'
SELECT :'myvar';

設定表示

-- 全設定表示
\pset

-- エラー時停止設定
\set ON_ERROR_STOP on

-- 行数表示
\pset footer off

よく使用する SQL 文 💡

文字列操作

-- 文字列連結
SELECT name || ' - ' || email FROM users;

-- 文字列検索
SELECT * FROM users WHERE name ILIKE '%john%';

-- 文字列置換
UPDATE users SET email = REPLACE(email, 'old.com', 'new.com');

日付操作

-- 現在日時
SELECT NOW(), CURRENT_DATE, CURRENT_TIME;

-- 日付フォーマット
SELECT TO_CHAR(created_at, 'YYYY-MM-DD HH24:MI:SS') FROM users;

-- 日付計算
SELECT * FROM users WHERE created_at > NOW() - INTERVAL '1 day';

JSON 操作(PostgreSQL 9.2+)

-- JSON検索
SELECT * FROM users WHERE data->>'key' = 'value';

-- JSON更新
UPDATE users SET data = jsonb_set(data, '{key}', '"new_value"');

トラブルシューティング 🔧

よくある問題

-- ロック確認
SELECT * FROM pg_locks WHERE NOT granted;

-- 実行中のクエリ確認
SELECT pid, state, query FROM pg_stat_activity WHERE state = 'active';

-- クエリ強制終了
SELECT pg_terminate_backend(pid);

-- 統計情報更新
ANALYZE;
ANALYZE table_name;

-- VACUUM実行
VACUUM;
VACUUM FULL table_name;

パフォーマンス確認

-- 遅いクエリ確認
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;

-- キャッシュヒット率
SELECT
    sum(heap_blks_read) as heap_read,
    sum(heap_blks_hit)  as heap_hit,
    sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio
FROM pg_statio_user_tables;

🔗 参考リンク