psqlの使い方


psqlには、色々な機能があるので、使い方をまとめてみました。

## psqlの説明
psqlはPostgreSQLに付属する対話型インターフェースです。対話的にコマンドを入力し、SQL文やメタコマンドを実行します。メタコマンドを使用することで、OSコマンドを実行することも可能です。また、ファイルから入力を読み込むこともできます。スクリプトの記述を簡便化したり、様々なタスクを自動化することが可能です。データベースのスーパーユーザ・一般ユーザともに、psqlを使用してデータベースに接続することができます。接続先ホストは、IPアドレスやホスト名で指定することができます。

## psqlコマンドの使い方

psqlコマンドの書式
```
psql [接続オプション] [オプション] [データベース名[ユーザ名]]
```

### 主な接続オプション
稼働中のPostgreSQLサーバに接続する際のオプションです。オプションの設定がない場合は、環境変数が使用されますが、環境変数の設定がない場合は、デフォルトの設定になります。

|接続オプション|説明|環境変数|デフォルト|
|--|--|--|--|
|-U ユーザ名|接続時のデータベースユーザ名を指定します。|PGUSER|OSユーザ名|
|-h ホスト名またはIPアドレス|接続先のホスト名またはIPアドレスを指定します。|PGHOST|UNIXドメインによる接続|
|-d データベース名|接続先のデータベース名を指定します。|PGDATABASE|データベースユーザ名|
|-p ポート名|接続先のポート番号を指定します。デフォルトは5432です。|PGPORT|5432|

下のように、psqlコマンドに現れる最初のオプションのないパラメータはデータベース名とみなされます。
```
psql -U exam data1
```
ユーザ名exam、データベース名data1を指定して接続します。

### 主なオプション

|オプション|説明|
|--|--|
|-l<br>--list|全てのデータベースのリストを表示し、終了する|
|-c コマンド<br>--command=コマンド|指定したコマンドを実行結果を示した後、終了する<br>本オプションは、複数回、指定することが可能|
|-f ファイル名<br>--file=ファイル名|指定したファイルをソースとして読み込み、実行結果を示した後、終了する|
|-s --sigle-step|各コマンドを実行するかキャンセルするのかを確認する。(シングルステップモード)|
|-1 --single-tranzaction|複数のコマンドを１つのトランザクションで実行する|
|-o ファイル名<br>--output=ファイル名|実行結果を指定したファイルに出力する|

指定したファイルの読み込みでは、シェルの入力リダイレクション(<)を使用して「< ファイル名」と記載することもできます。

指定したファイルの出力では、シェルの出力リダイレクション(>)を使用して、「> ファイル名」と記載することも出来ます。


#### 主な出力形式オプション

|オプション|説明|
|--|--|
|-A<br>--no-align|位置揃えなしの出力モードに切り替えます|
|-F separator<br>--field-separator=separator|separatorを位置揃えを行わない出力におけるフィールド区切り文字として使用します。|
|--csv|CSV (Comma-Separated Values)形式で出力|
|-H<br>--html|HTML形式で出力|


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: "postgres")
  -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: "/var/run/postgresql")
  -p, --port=PORT          database server port (default: "5432")
  -U, --username=USERNAME  database user name (default: "postgres")
  -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>.
PostgreSQL home page: <https://www.postgresql.org/> 
```

#### 非対話型の使い方

実施例1 全てのデータベースのリストを表示する
```
$ psql -l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 ossdb     | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 ossdb2    | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 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
(5 rows)
```

実施例2 実施例1を -c オプションで実施
```
$ psql -c '\l'
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 ossdb     | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 ossdb2    | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 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
(5 rows)
```

実施例3 ossdbに接続して、コマンド '\d customer' を実施て、customerテーブルの定義を表示する 
```
$ psql -c '\d customer' ossdb
                 Table "public.customer"
    Column     |  Type   | Collation | Nullable | Default 
---------------+---------+-----------+----------+---------
 customer_id   | integer |           |          | 
 customer_name | text    |           |          | 
Indexes:
    "customer_idx1" btree (md5(customer_name))
```

実施例4 ossdbに接続して、SQL文を実施
```
$ psql ossdb -c 'select * from customer'
 customer_id | customer_name 
-------------+---------------
           2 |  鈴木物産
           3 |  高橋商店
           1 |  佐藤商事
           2 |  鈴木物産
           3 |  高橋商店
(5 rows)
```

実施例5   SQL文(-c オプション)を複数回指定して、出力結果を表示
```
$ psql ossdb -c 'select * from customer' -c 'select * from orders'
 customer_id | customer_name 
-------------+---------------
           2 |  鈴木物産
           3 |  高橋商店
           1 |  佐藤商事
           2 |  鈴木物産
           3 |  高橋商店
(5 rows)

 order_id |         order_date         | customer_id | prod_id | qty 
----------+----------------------------+-------------+---------+-----
        1 | 2024-03-24 22:15:13.579674 |           1 |       1 |  10
        2 | 2024-03-24 22:15:13.582427 |           2 |       2 |   5
        3 | 2024-03-24 22:15:13.583794 |           3 |       3 |   8
        4 | 2024-03-24 22:15:13.5851   |           2 |       1 |   3
        5 | 2024-03-24 22:15:13.586369 |           3 |       2 |   4
(5 rows)
```

実施例6 SQL文を実施し、その結果をCSV形式で出力
```
$ psql ossdb -c 'select * from customer' --csv
customer_id,customer_name
2, 鈴木物産
3, 高橋商店
1, 佐藤商事
2, 鈴木物産
3, 高橋商店
```

実施例6 SQL文を実施し、その結果を位置揃えなしでの出力
```
$ psql ossdb -c 'select * from customer' -A
customer_id|customer_name
2| 鈴木物産
3| 高橋商店
1| 佐藤商事
2| 鈴木物産
3| 高橋商店
(5 rows)
```

実施例7 SQL文を実施し、その結果を位置揃えなしで、セパレータを , で出力
```
$ psql ossdb -c 'select * from customer' -A -F ,
customer_id,customer_name
2, 鈴木物産
3, 高橋商店
1, 佐藤商事
2, 鈴木物産
3, 高橋商店
(5 rows)
```

実施例8 ファイルを指定して、SQL文を実施
```
$ psql ossdb -f SelectCustomer.txt 
 customer_id | customer_name 
-------------+---------------
           2 |  鈴木物産
           3 |  高橋商店
           1 |  佐藤商事
           2 |  鈴木物産
           3 |  高橋商店
(5 rows)
```

実施例9 ファイルを指定して、SQL文を実施
```
$ psql ossdb -f SelectTables.txt 
 customer_id | customer_name 
-------------+---------------
           2 |  鈴木物産
           3 |  高橋商店
           1 |  佐藤商事
           2 |  鈴木物産
           3 |  高橋商店
(5 rows)

 order_id |         order_date         | customer_id | prod_id | qty 
----------+----------------------------+-------------+---------+-----
        1 | 2024-03-24 22:15:13.579674 |           1 |       1 |  10
        2 | 2024-03-24 22:15:13.582427 |           2 |       2 |   5
        3 | 2024-03-24 22:15:13.583794 |           3 |       3 |   8
        4 | 2024-03-24 22:15:13.5851   |           2 |       1 |   3
        5 | 2024-03-24 22:15:13.586369 |           3 |       2 |   4
(5 rows)
```

実施例11 リダイレクトでファイルを指定して、SQLを実施
```
$ psql ossdb < SelectCustomer.txt 
 customer_id | customer_name 
-------------+---------------
           2 |  鈴木物産
           3 |  高橋商店
           1 |  佐藤商事
           2 |  鈴木物産
           3 |  高橋商店
(5 rows)
```

実施例12 ファイルを指定して、SQL文を実施、結果をファイルに出力
```
$ psql ossdb -f SelectCustomer.txt -o SelectCustomerResult.txt

$ cat SelectCustomerResult.txt 
 customer_id | customer_name 
-------------+---------------
           2 |  鈴木物産
           3 |  高橋商店
           1 |  佐藤商事
           2 |  鈴木物産
           3 |  高橋商店
(5 rows)
```

#### 対話型の使い方

対話型でpsql コマンドを使用し、正常に接続されると、"postgres=#”のように”データベース名=#”が表示されます。

下は、データベース ossdbに接続した実施例です
```
$ psql ossdb
psql (14.12 (Ubuntu 14.12-0ubuntu0.22.04.1))
Type "help" for help.

ossdb=# 
```

psqlを終了する場合は、\q と入力して終了します。

```
ossdb=# \q
$ 
```

sql文を入力して、実施すると、その結果が画面に表示されます。
```
ossdb=# select * from customer;
 customer_id | customer_name 
-------------+---------------
           2 |  鈴木物産
           3 |  高橋商店
           1 |  佐藤商事
           2 |  鈴木物産
           3 |  高橋商店
(5 rows)
```

### 主なメタコマンド

|内容|メタコマンド|
|----|------------|
|メタコマンドのヘルプを表示|\\?|
|指定したメタコマンドのヘルプを表示|\\? メタコマンド|
|データベース一覧の表示|\l|
|カレントデータベースの変更|\c データベース名|
|テーブル一覧の表示|\d または \dt|
|テーブル一覧の表示(アクセス権つき)|\z または \dp|
|テーブル定義を表示|\d テーブル名|
|ロール一覧の表示|\du|
|ユーザー定義関数・プロシージャ一覧の表示|\df|
|ユーザ定義関数・プロシージャの詳細の表示|\df+ 関数名・プロシージャ名|
|ファイルを指定して、SQL文を実施|\i ファイルパス名|
|テーブル内容のエクスポート、インポート|\copy|
|直前のコマンドの定期実行|\watch 実行間隔|
|すべての表示オプションの現在の状態の表示|\pset|
|指定した表示オプションを表示|\pset 表示オプション|
|指定した表示オプションの変更|\pset 表示オプション 値|
|問い合わせ実行時間の表示・非表示|\timing|


#### メタコマンドのヘルプを表示 &nbsp; \\?

色んなメタコマンドがあり、表示内容が多いです。
```
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 [(OPTIONS)] [FILE]  execute query (and send results to file or |pipe);
                         \g with no arguments is equivalent to a semicolon
  \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 [(OPTIONS)] [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 [-n] [STRING]    write string to standard output (-n for no newline)
  \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 [-n] [STRING]   write string to \o output stream (-n for no newline)
  \warn [-n] [STRING]    write string to standard error (-n for no newline)

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
  \dAc[+] [AMPTRN [TYPEPTRN]]  list operator classes
  \dAf[+] [AMPTRN [TYPEPTRN]]  list operator families
  \dAo[+] [AMPTRN [OPFPTRN]]   list operators of operator families
  \dAp[+] [AMPTRN [OPFPTRN]]   list support functions of operator families
  \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
  \des[+] [PATTERN]      list foreign servers
  \det[+] [PATTERN]      list foreign tables
  \deu[+] [PATTERN]      list user mappings
  \dew[+] [PATTERN]      list foreign-data wrappers
  \df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]
                         list [only agg/normal/procedure/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+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]
                         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 [ROLEPTRN [DBPTRN]] 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
  \dX     [PATTERN]      list extended statistics
  \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

```

####  データベース一覧の表示 &nbsp; \l

```
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 ossdb     | postgres | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | 
 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
(4 rows)
```

#### カレントデータベースの変更 &nbsp; \c

カレントデータベースを変更するときは、\c メタコマンドを使用します。

```
$ psql
psql (14.12 (Ubuntu 14.12-0ubuntu0.22.04.1))
Type "help" for help.

postgres=# \c ossdb
You are now connected to database "ossdb" as user "postgres".
ossdb=# 
```

#### テールブルの一覧を表示する &nbsp; \d, &nbsp; \dt

\d, \dt メタコマンドは、カレントデータベースのテーブルの一覧を表示します。

メタコマンド \d の実施例
```
ossdb=# \d
            List of relations
 Schema |     Name     | Type  |  Owner   
--------+--------------+-------+----------
 public | char_test    | table | postgres
 public | customer     | table | postgres
 public | date_sample  | table | postgres
 public | date_test    | table | postgres
 public | numeric_test | table | postgres
 public | orders       | table | postgres
 public | prod         | table | postgres
 public | varchar_test | table | postgres
 public | zip          | table | postgres
(9 rows)

```

メタコマンド \dt の実施例
```
ossdb-# \dt
            List of relations
 Schema |     Name     | Type  |  Owner   
--------+--------------+-------+----------
 public | char_test    | table | postgres
 public | customer     | table | postgres
 public | date_sample  | table | postgres
 public | date_test    | table | postgres
 public | numeric_test | table | postgres
 public | orders       | table | postgres
 public | prod         | table | postgres
 public | varchar_test | table | postgres
 public | zip          | table | postgres
(9 rows)
```

### テーブル一覧の表示(アクセス権つき) &nbsp; \z, &nbsp; \dp

\z コマンドの実施例
```
ossdb-# \z
                                Access privileges
 Schema |     Name     | Type  | Access privileges | Column privileges | Policies 
--------+--------------+-------+-------------------+-------------------+----------
 public | char_test    | table |                   |                   | 
 public | customer     | table |                   |                   | 
 public | date_sample  | table |                   |                   | 
 public | date_test    | table |                   |                   | 
 public | numeric_test | table |                   |                   | 
 public | orders       | table |                   |                   | 
 public | prod         | table |                   |                   | 
 public | varchar_test | table |                   |                   | 
 public | zip          | table |                   |                   | 
(9 rows)
```

\dp コマンドの実施例
```
ossdb=# \dp
                                Access privileges
 Schema |     Name     | Type  | Access privileges | Column privileges | Policies 
--------+--------------+-------+-------------------+-------------------+----------
 public | char_test    | table |                   |                   | 
 public | customer     | table |                   |                   | 
 public | date_sample  | table |                   |                   | 
 public | date_test    | table |                   |                   | 
 public | numeric_test | table |                   |                   | 
 public | orders       | table |                   |                   | 
 public | prod         | table |                   |                   | 
 public | varchar_test | table |                   |                   | 
 public | zip          | table |                   |                   | 
(9 rows)
```

### ロール(ユーザー)の一覧を表示する &nbsp; \du

```
ossdb-# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 user001   |                                                            | {}
 user002   |                                                            | {}
 user003   |                                                            | {}
 user004   |                                                            | {}
 user005   |                                                            | {}
 user006   |                                                            | {}
 user007   |                                                            | {}
 user008   | Cannot login                                               | {}
 user009   |                                                            | {}
 user010   | Create DB                                                  | {}
 user011   |                                                            | {}
```

### ユーザー定義関数、ユーザー定義プロジージャの一覧を表示する &nbsp; \df

\df コマンドで作成した関数、プロシージャの一覧を表示させることが出来ます

\df コマンドの実施例
```
testdb=# \df
                           List of functions
 Schema |     Name     | Result data type | Argument data types | Type 
--------+--------------+------------------+---------------------+------
 public | delete_prod  |                  |                     | proc
 public | echosql      | text             | name text           | func
 public | helloworld   | text             |                     | func
 public | prod_name    | text             |                     | func
 public | testdataprod | void             |                     | func
(5 rows)
```

###  指定した関数、プロシージャのソースコードを含む詳細を表示 \df+ 関数名またはプロシージャ名  

```
testdb-# \df+ echosql
                                                                                   List of functions
 Schema |  Name   | Result data type | Argument data types | Type | Volatility | Parallel |  Owner   | Security | Access privileges | Language |       Source code        | Description 
--------+---------+------------------+---------------------+------+------------+----------+----------+----------+-------------------+----------+--------------------------+-------------
 public | echosql | text             | name text           | func | volatile   | unsafe   | postgres | invoker  |                   | sql      |                         +| 
        |         |                  |                     |      |            |          |          |          |                   |          |   SELECT name AS result;+| 
        |         |                  |                     |      |            |          |          |          |                   |          |                          | 
(1 row)
```

### ファイルを指定して、SQL文を実施 &nbsp; \i

\i メタコマンドは、指定したファイルに記載されているSQL文を実施します。

```
$ cat /var/tmp/SelectCustomer.txt 
select * from customer;

$ psql ossdb
psql (14.12 (Ubuntu 14.12-0ubuntu0.22.04.1))
Type "help" for help.

ossdb=# \i /var/tmp/SelectCustomer.txt
 customer_id | customer_name 
-------------+---------------
           2 |  鈴木物産
           3 |  高橋商店
           1 |  佐藤商事
           2 |  鈴木物産
           3 |  高橋商店
(5 rows)
```

### テーブル内容を出力 &nbsp; \copy 

\copy メタコマンドは、指定したテーブルの内容を指定したファイルに出力します。

```
ossdb=# \copy customer to /var/tmp/customer.txt
COPY 5
ossdb=# \q

$ cat /var/tmp/customer.txt
2	 鈴木物産
3	 高橋商店
1	 佐藤商事
2	 鈴木物産
3	 高橋商店
```

デリミッターを指定して、CSV形式で出力します。
```
# \copy customer to '/var/tmp/customer.csv' delimiter ','
```


#### COPY SQL文でテーブル内容を出力 

\copy メタコマンドは、SQL文でも実行することが出来ます。

指定したテーブル内容をCSV形式でファイルに出力する場合、以下のように実施します。
```
COPY table_name TO 'filename' WITH DELIMITER AS ',' 
COPY table_name TO 'filename' DELIMITER AS ','
COPY table_name TO 'filename' DELIMITER ','
COPY table_name TO 'filename' CSV
COPY table_name TO 'filename' WITH CSV
```

COPY文の対象はテーブルのため、ビューを出力することが出来きませんが、以下のようにすると、ビューでも出力することが出来ます。
```
COPY (select * from view_name) TO 'filename' 
```

### CSVファイルのデータをテーブルにインポートする &nbsp; \copy

CSV形式のデータを指定したテーブルにインポートします
```
# \copy <Table name> from <File name/pass> with csv
```

実施例
```
$ cat /var/tmp/customer.csv
1,佐藤商事
2,鈴木物産
3,高橋商店
postgres@taka-X202E:~$ psql testdb
psql (14.12 (Ubuntu 14.12-0ubuntu0.22.04.1))
Type "help" for help.

testdb=# \copy customer from /var/tmp/customer.csv with csv
COPY 3

testdb=# select * from customer;
 customer_id | customer_name 
-------------+---------------
           1 | 佐藤商事
           2 | 鈴木物産
           3 | 高橋商店
(3 rows)
```

#### COPY SQL文でCSVファイルをインポートする

指定したテーブル内容をCSV形式でファイルに出力する場合、以下のように実施します。
```
COPY table_name FROM 'filename' WITH DELIMITER AS ',' 
COPY table_name FROM 'filename' DELIMITER AS ','
COPY table_name FROM 'filename' DELIMITER ','
COPY table_name FROM 'filename' CSV
COPY table_name FROM 'filename' WITH CSV
```

実施例
```
testdb=# \copy customer from /var/tmp/customer.csv csv
COPY 3
testdb=# select * from customer;
 customer_id | customer_name 
-------------+---------------
           1 | 佐藤商事
           2 | 鈴木物産
           3 | 高橋商店
(3 rows)

```

#### 直前のコマンドを繰り返し実行する &nbsp; \watch

直前に実施したコマンドを指定した間隔(秒)で繰り返し実行します
```
# \watch <実施間隔>
```


3秒間隔でコマンドを実施
```
testdb=# insert into customer values (1, '佐藤商事');
INSERT 0 1
testdb=# \watch 3
2024年07月15日 15時52分09秒 (every 3s)

INSERT 0 1

2024年07月15日 15時52分12秒 (every 3s)

INSERT 0 1

2024年07月15日 15時52分15秒 (every 3s)

INSERT 0 1

2024年07月15日 15時52分18秒 (every 3s)

INSERT 0 1

2024年07月15日 15時52分21秒 (every 3s)

INSERT 0 1

\q2024年07月15日 15時52分24秒 (every 3s)

INSERT 0 1

^C
testdb=# select * from customer;
 customer_id | customer_name 
-------------+---------------
           1 | 佐藤商事
           1 | 佐藤商事
           1 | 佐藤商事
           1 | 佐藤商事
           1 | 佐藤商事
           1 | 佐藤商事
           1 | 佐藤商事
(7 rows)
```

#### すべての表示オプションの現在の状態の表示 &nbsp; \pset

```
# \pset
```

実施例
```
testdb=# \pset
border                   1
columns                  0
csv_fieldsep             ','
expanded                 off
fieldsep                 '|'
fieldsep_zero            off
footer                   on
format                   aligned
linestyle                ascii
null                     ''
numericlocale            off
pager                    1
pager_min_lines          0
recordsep                '\n'
recordsep_zero           off
tableattr                
title                    
tuples_only              off
unicode_border_linestyle single
unicode_column_linestyle single
unicode_header_linestyle single
xheader_width            full
```

#### 指定した表示オプションを表示 &nbsp; \pset 表示オプション

```
# \pset 表示オプション
```

実施例
```
testdb=# \pset null
Null display is "".
```

#### 指定した表示オプションを変更 &nbsp; \pset 表示オプション 設定値

```
# \pset 表示オプション 設定値
```

実施例
```
testdb=# select echo_pltcl(null);
 echo_pltcl 
------------
 
(1 row)

testdb=# testdb=# \pset null '(null)'
Null display is "(null)".

testdb=# select echo_pltcl(null);
 echo_pltcl 
------------
 (null)
(1 row)
```

#### 問い合わせ実行時間の表示・非表示 &nbsp; \timing
サブコマンドを実施する前に、実行時間が表示されていない場合は、本サブコマンドを実行すると、実行したSQL文の実行時間を表示されるようになります。<br>
実行したSQL文の実行時間を表示されている状況で本サブコマンドを実行すると、実行時間が表示されなくなります。
```
# \timing
```

実施例
```
testdb4=# \timing
Timing is on.
testdb4=# select * from orders;
 order_id |         order_date         | customer_id | prod_id | qty 
----------+----------------------------+-------------+---------+-----
        1 | 2024-11-04 11:47:19.691619 |           1 |       1 |  10
        2 | 2024-11-04 11:47:20.696869 |           2 |       2 |   5
        3 | 2024-11-04 11:47:21.698209 |           3 |       3 |   8
        4 | 2024-11-04 11:47:22.699217 |           2 |       1 |   3
        5 | 2024-11-04 11:47:23.700495 |           3 |       2 |   4
(5 rows)

Time: 2.043 ms
```


### 参照情報
* [PostgreSQL 14.5 psql](https://www.postgresql.jp/document/14/html/app-psql.html)
* [PostgreSQLのCOPYの説明](https://www.postgresql.jp/docs/14/sql-copy.html)
* [PostgreSQLでcsvファイルのインポート](https://qiita.com/sf213471118/items/49a8c9e31930a761351a)
* [psql 、私の好きなツールです](https://event.ospn.jp/slides/OSC2022_OnlineKyoto/OSC-kyoto-psql.pdf)
* [【普段使いできる】psql メタコマンド10選](https://www.wantedly.com/companies/appbrew/post_articles/874672)