PostgreSQLスキルアップノート(自己啓発のための個人サイト)
psqlの使い方・起動編
【一覧に戻る】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ psqlの使い方・psql起動方法編
■■■■
■■■■
■■■■ 2012/11/6
■■■■ 使用環境:PostgreSQL9.1.4 (CentOS6.2)
(C) 2012 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
★自己都合により実機確認は9.1、マニュアルへのリンクは9.2としています。
・マニュアル
psql →●[マニュアル]
・マニュアル参考(本ページ記載対象外)
■1■ psqlの簡単な起動方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【注意】ここではホストとポートは指定は行わない。
(自サーバのデフォルト5432ポートへ接続)
1.接続先を何も指定しない方法
──────────────────────────────
【□】 psql
OSユーザ名と同じユーザ名を使ってユーザ名と同じ名前のDBへ接続。
psotgresユーザなら、postgresデータベースへ接続。
ただし環境変数PGDATABASEや、PGUSER(後述)の設定があればそれに従い接続される。
2.環境変数に接続先を設定しておく方法
──────────────────────────────
あらかじめ環境変数に接続先のDBやユーザ名を設定しておく。
.bash_profileなどに設定
環境変数
-------------------------------------------------------
・PGDATABASE
・PGUSER
・PGHOST ここでは省略(自分のサーバがデフォルト)
・PGPORT ここでは省略(5432がデフォルト)
【□】 export PGDATABASE=test1
【□】 export PGUSER=test1
【□】 psql
3.起動時の引数で接続先を指定する方法
──────────────────────────────
起動時の引数に接続先の情報を与えて接続する。
(1)DB名指定
【□】 psql -d dbname
【□】 psql dbname
DB名は-dを省略できる。
ただ、-Uの場合も省略できるので注意。(後述参照)
(2)ユーザ名指定
【□】 psql -U username dbname
【参考】 psql -U username
この場合の接続先DBは?
環境変数PGDATABASEが設定されていなければ、
-Uでユーザ名指定した時点で、ユーザ名と同じDBへ接続にいこうとする・・
(3)DB名とユーザ名指定
-------------------------------------------------------------------
・DB名もユーザ名もオプション指定なしで引数に与えることができる。
・最初のオプションなしの引数はDB名とみなされる。
・DB名がすでに-dで与えられていればオプションなし引数はユーザ名とみなされる。
・オプションなし引数が2個あれば、DB名、ユーザ名の順で与えているとみなされる。
-------------------------------------------------------------------
【□】 psql -d dbname -U username
【□】 psql dbname username
【□】 psql -d dbname -U username
【□】 psql -d dbname username
【□】 psql dbname -U username
【□】 psql -U username dbname
■2■ OSコマンドラインから直接SQLを実行 (-cオプション)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-cは起動とともに1つコマンドを実行するためのオプション。
実行結果はOSのコマンドライン上に戻るのでシェルスクリプトなどで扱いやすい。
1.基本形
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【□】 psql database1 dba01 -P pager=off -c 'select * from t1;'
-P pager=off:ページャなし
[postgres@pg91 ~]$ psql database1 dba01 -P pager=off -c 'select * from t1;'
c1 | c2
----+----
1 | 16
: :
20 | 17
(20 行)
2.結果をシェル変数に代入
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【□】 val1=`psql database1 dba01 -t -A -c 'select count(*) from t1;'`
【□】 echo "[${val1}]"
[postgres@pg91 ~]$ echo "[${val1}]"
[31]
3.データとして利用(明細行のみ・カンマ区切り)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【□】 psql database1 dba01 -P pager=off -t -A -F "," -c 'select * from t1;'
-P pager=off:ページャなし
-t:明細行のみヘッダなし
-A:位置ぞろえなし
-F ",":フィールド区切りをカンマ
[postgres@pg91 ~]$ psql database1 dba01 -P pager=off -t -A -F "," -c 'select * from t1;'
1,16
2,10
3,19
4,7
5,3
:
:
【参考】-cはSQL文以外でも実行できる
(例) psql -c '\d'
★★★★★★★★★★★★
以下個人用メモ
★★★★★★★★★★★★
■ 実務ではどんな起動方法が最適か?
──────────────────────────────
・想定
本番サーバには業務のDBはひとつ。開発サーバには複数。
・方針
psqlの引数で接続先を与える方法だとシェルスクリプトが複数のDBに対応しづらく
なったり、手作業での指定による接続先誤りの危険あり。
そこで、統一方針として、環境変数に接続情報を設定する方法とする。
開発環境で設定した接続先を異なるDBに接続する場合には、環境変数を変更してから
作業するようにする。
・.bash_profileのPGDATABASE PGUSER にあらかじめ設定。
【□】 psql
【□】 \conninfo
You are connected to database "test1" as user "postgres" via socket in "/tmp" at port "5432".
【□】 上記により接続先DB、ユーザが正しいことを確認。
■ 作業記録を考慮したpsql起動方法(案)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ターミナルソフトにより作業ログを残すことを考慮した起動方法
デフォルトでpsqlを起動すると、手作業をしている場合はよいが、SQLスクリプトファイル
を呼び出して実行した場合、どんなSQL文が実行されたのかが記録として残せない。
-eまたは-aを使用するとスクリプトの実行内容を表示してくれるのでどんな作業が行われた
のかが分かりやすく保存できる。
用途によるが、-eは使わず、-aを指定した方がよさそう。(?)
-eは手打ちの時にもエコーバックしてしまい、手打ち内容と実行内容が重複して表示されて
しまうのが難点。
大量にSQLを発行する時は性能に注意。
1.-eオプション
──────────────────────────────
【□】 psql -e
スクリプト実行時などで、sqlファイルの内容を表示してくれる。
・-e指定なしの場合
[postgres@kvm00 tmp]$ psql
postgres=# \i test.sql
CREATE TABLE
・・・・どんなcreate文なのかは一切記録に残らない。
・-e指定ありの場合
[postgres@kvm00 tmp]$ psql -e
postgres=# \i test.sql
create table t8 (c1 varchar(10)); ←★
CREATE TABLE
・・・・実行したSQL文の内容が表示される。
-eオプションの場合、手打ち時もスクリプト時も同様に実行した内容
をおうむ返しのように表示する。
だから、手打ちで作業する場合にはわずらわしい。
2.-aオプション
──────────────────────────────
【□】 psql -a
-eの場合SQLの内容を残すのが目的だったが、
-aでは、SQL以外のコマンドも含めて記録に残せる。
それから-eでは対話形式の場合、入力した内容を実行した内容双方が
画面に残って無駄な記録となるが、-aではそれがない。
スクリプトファイルを実行した時だけ、実行内容が表示されるようになっている。
--------------------------
・-eの場合は・・・
[postgres@kvm00 tmp]$ psql -e
postgres=# \i test.sql
Timing is on.
create table t8 (c1 varchar(10));←実行したSQL文が記録
CREATE TABLE
Time: 10.798 ms
[postgres@kvm00 tmp]$ psql -e
psql (9.1.4)
Type "help" for help.
postgres=# select * from test1;
select * from test1; ←★対話形式では実行内容が表示される。表示がダブる。
c1
----
a
--------------------------
・-aの場合は・・・
[postgres@kvm00 tmp]$ psql -a
postgres=# \i test.sql
\timing on ←★timingコマンドも記録(ただしスクリプト実行時のみ)
Timing is on.
create table t8 (c1 varchar(10));←実行したSQLが記録(ただしスクリプト実行時のみ)
CREATE TABLE
Time: 11.313 ms
[postgres@kvm00 tmp]$ psql -a
psql (9.1.4)
Type "help" for help.
postgres=# select * from test1; ←★対話形式では実行内容が-eのように表示されない
c1
----
a
--------------------------
-aは、対話形式で使っている限りでは入力したコマンドをダブって表示する
ことはなく、スクリプトから実行したときだけ、実行した内容を表示してくれる。
-eではSQL文のみが出力の対象であるのに対して、-aではすべてのコマンドが対象になる
ところも動きが違う。
3.-Eオプション
──────────────────────────────
【□】 psql -E
\dなどのバックスラッシュコマンドを使ったときに、psql内部で発行しているSQLを表示してくれます。
DBAにとっては非常に役に立つオプション。
ただ、表示が多くなるので、起動時に指定することはないと思う。
必要な時にコマンドラインからの指定がよい。
・・・・後述で改めて記載し、ここでは省略。
■ファイル出力用途に使える(使えそうな)オプション
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・psql -o ファイル名 ・・・問い合わせ結果を指定したファイルへ書き込み
SQL以外のコマンドやエラー時は画面にでるが、
SQL正常実行時には画面には表示されずファイルに書かれる。
これも起動時オブションとしては用途は限定されるが
リストだけをきれいに結果に残せるので、シェルスクリプト
でのレポート出力など使い道はある。
・-L ファイル名・・・画面表示+ファイルの双方に出力
ただし、出力される内容はSQLとその結果のみ。
それ以外の\psetなどのコマンドは記録されない。
既存のファイルを指定すると上書きせず追加で書き込まれる。
********* QUERY **********
select * from test1;
**************************
c1
----
a
(1 row)
便利そうであまり使えない?
・psql -A ・・・ 位置揃えなし
・psql -F \| ・・・1位置揃えなしの場合のフィールド区切り文字
postgres=# select * from test4;
c1|c2|c3|c4
abcd|efgh|ijkl |mnop
・・・使える。
・psql -t 明細行のみでヘッダ等一切なし
■その他
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・psql -l ・・・利用可能なDB一覧
・psql -P ・・・ \pset形式の命令を起動時に指定
psql -P pager=off
・psql -f filename ・・・ファイル名指定実行
・psql -1 ・・・-f使用時に全体を1トランザクションとして扱う。
(シングルトランザクション)
・psql -v 変数=〜 ・・・起動時に変数格納
psql -v moji="aaaaa"
\echo :moji
aaaaa
・psql -s ・・・シングルステップ実行
実行のたびにENTERキーを押しながら進めていく。
■ 参考 psqlの起動オプション
──────────────────────────────
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
-X, --no-psqlrc do not read startup file (~/.psqlrc)
-1 ("one"), --single-transaction
execute command file as a single transaction
--help show this help, then exit
--version output version information, then exit
Input and output options:
-a, --echo-all echo all input from script
-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
-F, --field-separator=STRING
set field separator (default: "|")
-H, --html HTML table output mode
-P, --pset=VAR[=ARG] set printing option VAR to ARG (see \pset command)
-R, --record-separator=STRING
set record separator (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
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: "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.
以上