こんにちはフロントエンドエンジニアのまさにょんです!
今回は、PostgreSQLの基本的な操作方法・コマンドについてまとめて解説します。
目次
PostgreSQLに入る前の操作
PostgreSQLのバージョン確認 & install確認
psql --version
psql コマンドのヘルプ
psql --help
# [ psql --help コマンドの実行結果 ]
psql is the PostgreSQL interactive terminal.
Usage:
psql [OPTION]... [DBNAME [USERNAME]]
General options:
-c, --command=COMMAND run only single command (SQL or internal) and exit
-d, --dbname=DBNAME database name to connect to (default: "suda")
-f, --file=FILENAME execute commands from file, then exit
-l, --list list available databases, then exit
-v, --set=, --variable=NAME=VALUE
set psql variable NAME to VALUE
(e.g., -v ON_ERROR_STOP=1)
-V, --version output version information, then exit
-X, --no-psqlrc do not read startup file (~/.psqlrc)
-1 ("one"), --single-transaction
execute as a single transaction (if non-interactive)
-?, --help[=options] show this help, then exit
--help=commands list backslash commands, then exit
--help=variables list special variables, then exit
Input and output options:
-a, --echo-all echo all input from script
-b, --echo-errors echo failed commands
-e, --echo-queries echo commands sent to server
-E, --echo-hidden display queries that internal commands generate
-L, --log-file=FILENAME send session log to file
-n, --no-readline disable enhanced command line editing (readline)
-o, --output=FILENAME send query results to file (or |pipe)
-q, --quiet run quietly (no messages, only query output)
-s, --single-step single-step mode (confirm each query)
-S, --single-line single-line mode (end of line terminates SQL command)
Output format options:
-A, --no-align unaligned table output mode
--csv CSV (Comma-Separated Values) table output mode
-F, --field-separator=STRING
field separator for unaligned output (default: "|")
-H, --html HTML table output mode
-P, --pset=VAR[=ARG] set printing option VAR to ARG (see \pset command)
-R, --record-separator=STRING
record separator for unaligned output (default: newline)
-t, --tuples-only print rows only
-T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)
-x, --expanded turn on expanded table output
-z, --field-separator-zero
set field separator for unaligned output to zero byte
-0, --record-separator-zero
set record separator for unaligned output to zero byte
Connection options:
-h, --host=HOSTNAME database server host or socket directory (default: "local socket")
-p, --port=PORT database server port (default: "5432")
-U, --username=USERNAME database user name (default: "suda")
-w, --no-password never prompt for password
-W, --password force password prompt (should happen automatically)
For more information, type "\?" (for internal commands) or "\help" (for SQL
commands) from within psql, or consult the psql section in the PostgreSQL
documentation.
Report bugs to <pgsql-bugs@lists.postgresql.org>.
Login/Logout関連の操作
PostgreSQL(DB-System)にLoginする
PostgreSQLを直接操作するために、Loginします。
-p オプションを付与すると、Passwordの入力を求められるので、入力してEnterをします。
# localhostのDBに入る
psql <database_name>
# localHostのPostgreSQLに、User名 & DataBase名を指定してログインする
psql -U <username> -d <database_name>
# 外部PostgreSQLサーバーに接続する
psql -h <host> -p <port> -U <username> -d <database_name>
PostgreSQL(DB-System)からLogoutする
次の3つのコマンドのいずれかでログアウトできます。
postgres=# \q
postgres=# quit
postgres=# exit
PostgreSQLログイン後のヘルプ
PostgreSQL にLoginしている状態で、次のどちらかのコマンドでヘルプの確認ができます。
postgres=# help
# [ helpコマンドの実行結果 ]
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
SQLコマンドのヘルプ: \h
postgres=# \h
# [ \hコマンドの実行結果: SQLコマンドのヘルプ ]
Available help:
ABORT ALTER SEQUENCE CREATE AGGREGATE CREATE SUBSCRIPTION DROP EXTENSION DROP TEXT SEARCH PARSER REVOKE
ALTER AGGREGATE ALTER SERVER CREATE CAST CREATE TABLE DROP FOREIGN DATA WRAPPER DROP TEXT SEARCH TEMPLATE ROLLBACK
ALTER COLLATION ALTER STATISTICS CREATE COLLATION CREATE TABLE AS DROP FOREIGN TABLE DROP TRANSFORM ROLLBACK PREPARED
ALTER CONVERSION ALTER SUBSCRIPTION CREATE CONVERSION CREATE TABLESPACE DROP FUNCTION DROP TRIGGER ROLLBACK TO SAVEPOINT
ALTER DATABASE ALTER SYSTEM CREATE DATABASE CREATE TEXT SEARCH CONFIGURATION DROP GROUP DROP TYPE SAVEPOINT
ALTER DEFAULT PRIVILEGES ALTER TABLE CREATE DOMAIN CREATE TEXT SEARCH DICTIONARY DROP INDEX DROP USER SECURITY LABEL
ALTER DOMAIN ALTER TABLESPACE CREATE EVENT TRIGGER CREATE TEXT SEARCH PARSER DROP LANGUAGE DROP USER MAPPING SELECT
ALTER EVENT TRIGGER ALTER TEXT SEARCH CONFIGURATION CREATE EXTENSION CREATE TEXT SEARCH TEMPLATE DROP MATERIALIZED VIEW DROP VIEW SELECT INTO
ALTER EXTENSION ALTER TEXT SEARCH DICTIONARY CREATE FOREIGN DATA WRAPPER CREATE TRANSFORM DROP OPERATOR END SET
ALTER FOREIGN DATA WRAPPER ALTER TEXT SEARCH PARSER CREATE FOREIGN TABLE CREATE TRIGGER DROP OPERATOR CLASS EXECUTE SET CONSTRAINTS
ALTER FOREIGN TABLE ALTER TEXT SEARCH TEMPLATE CREATE FUNCTION CREATE TYPE DROP OPERATOR FAMILY EXPLAIN SET ROLE
ALTER FUNCTION ALTER TRIGGER CREATE GROUP CREATE USER DROP OWNED FETCH SET SESSION AUTHORIZATION
ALTER GROUP ALTER TYPE CREATE INDEX CREATE USER MAPPING DROP POLICY GRANT SET TRANSACTION
ALTER INDEX ALTER USER CREATE LANGUAGE CREATE VIEW DROP PROCEDURE IMPORT FOREIGN SCHEMA SHOW
ALTER LANGUAGE ALTER USER MAPPING CREATE MATERIALIZED VIEW DEALLOCATE DROP PUBLICATION INSERT START TRANSACTION
ALTER LARGE OBJECT ALTER VIEW CREATE OPERATOR DECLARE DROP ROLE LISTEN TABLE
ALTER MATERIALIZED VIEW ANALYZE CREATE OPERATOR CLASS DELETE DROP ROUTINE LOAD TRUNCATE
ALTER OPERATOR BEGIN CREATE OPERATOR FAMILY DISCARD DROP RULE LOCK UNLISTEN
ALTER OPERATOR CLASS CALL CREATE POLICY DO DROP SCHEMA MOVE UPDATE
ALTER OPERATOR FAMILY CHECKPOINT CREATE PROCEDURE DROP ACCESS METHOD DROP SEQUENCE NOTIFY VACUUM
ALTER POLICY CLOSE CREATE PUBLICATION DROP AGGREGATE DROP SERVER PREPARE VALUES
ALTER PROCEDURE CLUSTER CREATE ROLE DROP CAST DROP STATISTICS PREPARE TRANSACTION WITH
ALTER PUBLICATION COMMENT CREATE RULE DROP COLLATION DROP SUBSCRIPTION REASSIGN OWNED
ALTER ROLE COMMIT CREATE SCHEMA DROP CONVERSION DROP TABLE REFRESH MATERIALIZED VIEW
ALTER ROUTINE COMMIT PREPARED CREATE SEQUENCE DROP DATABASE DROP TABLESPACE REINDEX
ALTER RULE COPY CREATE SERVER DROP DOMAIN DROP TEXT SEARCH CONFIGURATION RELEASE SAVEPOINT
ALTER SCHEMA CREATE ACCESS METHOD CREATE STATISTICS DROP EVENT TRIGGER DROP TEXT SEARCH DICTIONARY RESET
psqlコマンドのヘルプ: \?
postgres=# \?
# [ \?コマンドの実行結果: psqlコマンドのヘルプ ]
General
\copyright show PostgreSQL usage and distribution terms
\crosstabview [COLUMNS] execute query and display results in crosstab
\errverbose show most recent error message at maximum verbosity
\g [FILE] or ; execute query (and send results to file or |pipe)
\gdesc describe result of query, without executing it
\gexec execute query, then execute each value in its result
\gset [PREFIX] execute query and store results in psql variables
\gx [FILE] as \g, but forces expanded output mode
\q quit psql
\watch [SEC] execute query every SEC seconds
Help
\? [commands] show help on backslash commands
\? options show help on psql command-line options
\? variables show help on special variables
\h [NAME] help on syntax of SQL commands, * for all commands
Query Buffer
\e [FILE] [LINE] edit the query buffer (or file) with external editor
\ef [FUNCNAME [LINE]] edit function definition with external editor
\ev [VIEWNAME [LINE]] edit view definition with external editor
\p show the contents of the query buffer
\r reset (clear) the query buffer
\s [FILE] display history or save it to file
\w FILE write query buffer to file
Input/Output
\copy ... perform SQL COPY with data stream to the client host
\echo [STRING] write string to standard output
\i FILE execute commands from file
\ir FILE as \i, but relative to location of current script
\o [FILE] send all query results to file or |pipe
\qecho [STRING] write string to query output stream (see \o)
Conditional
\if EXPR begin conditional block
\elif EXPR alternative within current conditional block
\else final alternative within current conditional block
\endif end conditional block
Informational
(options: S = show system objects, + = additional detail)
\d[S+] list tables, views, and sequences
\d[S+] NAME describe table, view, sequence, or index
\da[S] [PATTERN] list aggregates
\dA[+] [PATTERN] list access methods
\db[+] [PATTERN] list tablespaces
\dc[S+] [PATTERN] list conversions
\dC[+] [PATTERN] list casts
\dd[S] [PATTERN] show object descriptions not displayed elsewhere
\dD[S+] [PATTERN] list domains
\ddp [PATTERN] list default privileges
\dE[S+] [PATTERN] list foreign tables
\det[+] [PATTERN] list foreign tables
\des[+] [PATTERN] list foreign servers
\deu[+] [PATTERN] list user mappings
\dew[+] [PATTERN] list foreign-data wrappers
\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] functions
\dF[+] [PATTERN] list text search configurations
\dFd[+] [PATTERN] list text search dictionaries
\dFp[+] [PATTERN] list text search parsers
\dFt[+] [PATTERN] list text search templates
\dg[S+] [PATTERN] list roles
\di[S+] [PATTERN] list indexes
\dl list large objects, same as \lo_list
\dL[S+] [PATTERN] list procedural languages
\dm[S+] [PATTERN] list materialized views
\dn[S+] [PATTERN] list schemas
\do[S+] [PATTERN] list operators
\dO[S+] [PATTERN] list collations
\dp [PATTERN] list table, view, and sequence access privileges
\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]
\drds [PATRN1 [PATRN2]] list per-database role settings
\dRp[+] [PATTERN] list replication publications
\dRs[+] [PATTERN] list replication subscriptions
\ds[S+] [PATTERN] list sequences
\dt[S+] [PATTERN] list tables
\dT[S+] [PATTERN] list data types
\du[S+] [PATTERN] list roles
\dv[S+] [PATTERN] list views
\dx[+] [PATTERN] list extensions
\dy[+] [PATTERN] list event triggers
\l[+] [PATTERN] list databases
\sf[+] FUNCNAME show a function's definition
\sv[+] VIEWNAME show a view's definition
\z [PATTERN] same as \dp
Formatting
\a toggle between unaligned and aligned output mode
\C [STRING] set table title, or unset if none
\f [STRING] show or set field separator for unaligned query output
\H toggle HTML output mode (currently off)
\pset [NAME [VALUE]] set table output option
(border|columns|csv_fieldsep|expanded|fieldsep|
fieldsep_zero|footer|format|linestyle|null|
numericlocale|pager|pager_min_lines|recordsep|
recordsep_zero|tableattr|title|tuples_only|
unicode_border_linestyle|unicode_column_linestyle|
unicode_header_linestyle)
\t [on|off] show only rows (currently off)
\T [STRING] set HTML <table> tag attributes, or unset if none
\x [on|off|auto] toggle expanded output (currently off)
Connection
\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}
connect to new database (currently "postgres")
\conninfo display information about current connection
\encoding [ENCODING] show or set client encoding
\password [USERNAME] securely change the password for a user
Operating System
\cd [DIR] change the current working directory
\setenv NAME [VALUE] set or unset environment variable
\timing [on|off] toggle timing of commands (currently off)
\! [COMMAND] execute command in shell or start interactive shell
Variables
\prompt [TEXT] NAME prompt user to set internal variable
\set [NAME [VALUE]] set internal variable, or list all if no parameters
\unset NAME unset (delete) internal variable
Large Objects
\lo_export LOBOID FILE
\lo_import FILE [COMMENT]
\lo_list
\lo_unlink LOBOID large object operations
ロール(ユーザー)の各種操作
ユーザー情報一覧を表示
# select * from pg_user; で、ユーザー情報一覧を表示する
postgres=# select * from pg_user;
usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig
----------+----------+-------------+----------+---------+--------------+----------+----------+-----------
postgres | 10 | t | t | t | t | ******** | |
robotama | 16386 | f | f | f | f | ******** | |
(2 rows)
現在のユーザー(Role)を表示
select current_user;
ユーザーのロールを一覧表示
# \du でユーザーのロールを一覧表示
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
ロール(ユーザー)作成
ロール属性には、login, superuser, createdb, createrole, replication, password の6つのがあります。
Role | 説明 |
---|---|
login | PostgreSQLにログインすることができるRole。 データベースにアクセスする権限を持たない。 |
superuser | すべてのデータベース、テーブル、そしてロールに対して完全な制御権限を持つRole。 |
createdb | 新しいデータベースを作成することができるRole。 |
createrole | 新しいロールを作成することができるRole。 |
replication | ストリーミングレプリケーションを設定するために必要な権限を持つRole。 |
password | 他のユーザーのパスワードを変更する権限を持つRole。 superuserにもこの権限があるため、このRoleは必ずしも必要ではない。 |
# create role <ROLE_NAME> <Attributes>; でロール(ユーザー)作成
postgres=# create role robotama login;
CREATE ROLE
# 追加した、Roleを確認する
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
robotama | | {}
ユーザーの切り替え
\connect - <USER_NAME>
ロール(ユーザー)属性の変更
# alter role <ROLE_NAME> <Attributes>; でロール(ユーザー)属性の変更
postgres=# alter role robotama nologin;
ALTER ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
robotama | Cannot login | {}
スーパーユーザーへ変更
alter role <USER_NAME> with creatural superuser;
ロール(ユーザー)の削除
# drop role <ROLE_NAME>; でロール(ユーザー)の削除
postgres=# drop role robotama;
DROP ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
スーパーユーザー権限剥奪
alter role <USER_NAME> with creatural nosuperuser;
ロール(ユーザー)にTableの操作権限を付与する
与えられる権限の一覧は、次のとおりです。
権限 | 説明 |
---|---|
SELECT | テーブルから行を選択する権限。 |
INSERT | テーブルに新しい行を挿入する権限。 |
UPDATE | テーブル内の既存の行を更新する権限。 |
DELETE | テーブル内の既存の行を削除する権限。 |
TRUNCATE | テーブルの全行を削除する権限。 |
REFERENCES | 外部キー制約を設定する権限。 |
TRIGGER | テーブルにトリガーを作成する権限。 |
CREATE | データベースオブジェクトを作成する権限。 |
CONNECT | データベースに接続する権限。 |
TEMPORARY | 一時的なテーブルを作成する権限。 |
EXECUTE | 関数やストアドプロシージャを実行する権限。 |
USAGE | データベースオブジェクトを使用する権限。 |
ALL PRIVILEGES | オブジェクトに対する全ての操作を行う権限。主にSUPERUSERに設定される。 |
# grant <権限> on <TABLE_NAME> to <ROLE_NAME>; でロール(ユーザー)に権限を付与する
# usersテーブルの参照、レコード追加、更新、削除の権限をrobotamaロールに付与する
postgres=# grant select, insert, update, delete on users to robotama;
ロール(ユーザー)のTable操作権限を確認する
# \z < TABLE_NAME > または、\dp < TABLE_NAME > でロール(ユーザー)のTable操作権限を確認する
postgres=# \dp users
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+-------+-------+---------------------------+-------------------+----------
public | users | table | postgres=arwdDxt/postgres+| |
| | | robotama=arwd/postgres | |
(1 row)
postgres=# \z users
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+-------+-------+---------------------------+-------------------+----------
public | users | table | postgres=arwdDxt/postgres+| |
| | | robotama=arwd/postgres | |
(1 row)
ロール(ユーザー)の権限を剥奪する
# revoke <権限> on <TABLE_NAME> from <ROLE_NAME>; でロール(ユーザー)の権限を剥奪する
postgres=# revoke select, insert, update, delete on users from robotama;
データベースの操作系統
データベース一覧の表示・確認
# \l で、データベース一覧の表示・確認
postgres-# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(3 rows)
データベースを新規作成する
# create database < DB_NAME >; で データベースの追加
postgres=# create database robotama;
CREATE DATABASE
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
robotama | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
データベースをオーナー指定して新規作成する
create database <DB_NAME> owner <OWNER_NAMR>;
データベースをエンコーディング指定して新規作成する
create database <DB_NAME> encoding <ENCODE_NAMR>;
データベースをオーナー&エンコーディング指定して新規作成する
postgres=# create database test owner robotama encoding UTF8;
CREATE DATABASE
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
postgres | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
robotama | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
template0 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
test | robotama | UTF8 | ja_JP.UTF-8 | ja_JP.UTF-8 |
(5 rows)
データベースの選択・切り替え
# \c < DB_NAME > または、\connect < DB_NAME > でデータベースの選択・切り替え
postgres=# \c robotama
psql (12.14, server 11.19)
You are now connected to database "robotama" as user "postgres".
robotama=# \connect postgres
psql (12.14, server 11.19)
You are now connected to database "postgres" as user "postgres".
postgres=#
データベースの削除
postgres=# drop database robotama;
DROP DATABASE
Tableの操作系統
テーブルの作成
# テーブルの作成
postgres=# CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP
);
テーブルだけの一覧表示
\dt
コマンドは、データベース内のテーブルだけの一覧を表示します。
# \dtコマンドで、テーブルだけの一覧表示
postgres=# \dt
List of relations
Schema | Name | Type | Owner
--------+-------+-------+----------
public | users | table | postgres
(1 row)
テーブル一覧の表示( View, Index, Sequence 含む詳細情報 )
\d
と \dt
コマンドは、どちらもテーブル情報を表示するために使用されますが、表示される情報の範囲に違いがあります。
\d
コマンドは、Table や View, Index, Sequenceなどのオブジェクトに関する詳細情報を表示します。
それに対して\dt
コマンドは、テーブルだけの一覧を表示するために使用されます。
# \d で、テーブル一覧の表示( View, Index, Sequence 含む詳細情報 )
postgres=# \d
List of relations
Schema | Name | Type | Owner
--------+--------------+----------+----------
public | users | table | postgres
public | users_id_seq | sequence | postgres
(2 rows)
テーブルの詳細表示 (テーブル構造の確認)
# \d <TABLE_NAME> で、テーブルのスキーマの詳細表示
postgres=# \d users
Table "public.users"
Column | Type | Collation | Nullable | Default
------------+-----------------------------+-----------+----------+-----------------------------------
id | integer | | not null | nextval('users_id_seq'::regclass)
name | character varying(50) | | not null |
email | character varying(100) | | not null |
password | character varying(100) | | not null |
created_at | timestamp without time zone | | not null | now()
updated_at | timestamp without time zone | | |
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
"users_email_key" UNIQUE CONSTRAINT, btree (email)
スキーマ操作関連
スキーマ一覧
# \dn でスキーマ一覧表示できます。
postgres=# \dn
List of schemas
Name | Owner
--------+----------
public | postgres
(1 row)
スキーマを確認
# select current_schema; でスキーマを確認できます。
postgres=# select current_schema;
current_schema
----------------
public
(1 row)
スキーマ作成
create schema <schema_name>;
スキーマ変更
set search_path to <schema_name>;