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.









以上 
inserted by FC2 system