LoginSignup
36
28

psql による PostgreSQL サーバへのログイン・接続方法

Last updated at Posted at 2020-03-26

方法 1. デフォルト値

psql
項目
ユーザ名 ログインしている OS のユーザ名
データベース名 ログインしている OS のユーザ名
ホスト localhost, 127.0.0.1
ポート番号 5432

方法 2. コマンドの引数

-U, -d は省略して書けます。

psql ユーザ名 データベース名

psql -U ユーザ名 -d データベース名

psql -h ホスト -p ポート ユーザ名 データベース名

psql -h ホスト -p ポート -U ユーザ名 -d データベース名

◯ パスワードを忘れた場合

OS の root 権限を持っている場合だけの対処法です。パスワードは忘れないようにしてください。

pg_hba.conf を開き peer または md5 から trust に書き換えます。パスワードが無効になります。

pg_hba.conf
# 変更前
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             127.0.0.1/32            md5

# 変更後
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             127.0.0.1/32            trust

詳細はリンク先をご確認ください。

◯ Docker を使用している場合

ご自身のローカルのパソコンで Docker を使って PostgreSQL サーバを立ち上げている場合は、たとえローカルホストであっても -h localhost または -h 127.0.0.1 を明示してログインしてください。そうしないと以下のようなエラーに遭遇します。理由も記載しました。

方法 3. パスワードファイル

この「方法 3. パスワードファイル」はログインするたびにユーザ名などを入力するのが面倒な場合は便利な気がしますが...

パスワードをファイルに直接書き込む場合、ほかの人がそのファイルを見られる可能性があることに留意してください。これを避けたい場合

  1. ファイルにパスワードを保存しない、または
  2. ファイルに閲覧の制限をかける(例: bash で chmod 600 ~/.pgpass

ことなどを検討してください。

Unixシステムにおいて、パスワードファイルの権限はグループ、他者へのアクセスをすべて拒否しなければなりません。 これは chmod 0600 ~/.pgpass といったコマンドによって行います。 権限をこれよりも緩くすると、このファイルは無視されます。
Microsoft Windowsにおいては、このファイルが安全なディレクトリに格納されていることを前提としていますので、特別に行われる権限の検査はありません。

◯ ファイルの書式

コロン : で区切ります。

ホスト:ポート:データベース名:ユーザ名:パスワード

◯ ファイルの場所

1. macOS, Ubuntu の場合
  ~/.pgfile

2. Windows の場合
  %APPDATA%\postgresql\pgpass.conf

3. あるいは環境変数 PGPASSFILE でファイルパスを指定できます。

方法 4. 環境変数

この「方法 4. 環境変数」も便利な気がしますが...

psql の対話シェルではなく直接 OS の対話シェルにパスワードを書いた場合、コマンドの履歴にパスワードが残ります。例えば bash の場合 ~/.bash_history にコマンドが保存されます。もしかしたらほかにもどこかで保存されているかもしれず詳しいことは存じておりません。ほかの人がそのコマンドの履歴を見られる可能性があることに留意してください。これを避けたい場合

  1. 以下のように OS の対話シェルにはパスワードを書き込まない、または
  2. システムレベルで提供されているキーストア(例: macOS の Keychain、Linux の Secret Service API)を利用する

ことなどを検討してください。

macOS, Ubuntu - bash
export PGHOST=ホスト
export PGPORT=ポート番号
export PGDATABASE=データベース名
export PGUSER=ユーザ名
export PGPASSWORD=パスワード
psql
Windows - コマンドプロンプト
set PGHOST=ホスト
set PGPORT=ポート番号
set PGUSER=ユーザ名
set PGDATABASE=データベース名
set PGPASSWORD=パスワード
psql
Windows - PowerShell
$env:PGHOST="ホスト"
$env:PGPORT="ポート番号"
$env:PGUSER="ユーザ名"
$env:PGDATABASE="データベース名"
$env:PGPASSWORD="パスワード"
psql

◯ ワンライナーでログインしたい

環境変数 PGPASSWORD を使った、つぎのような書き方があるそうです。

macOS, Ubuntu - bash
PGPASSWORD=パスワード psql -U ユーザ名 データベース名
Windows - コマンドプロンプト
# ワンライナーでは書けないので2行で書いてください...orz
set PGPASSWORD=パスワード
psql -U ユーザ名 データベース名
Windows - PowerShell
$env:PGPASSWORD="パスワード"; psql -U ユーザ名 データベース名

まとめ

PostgreSQL サーバへのログイン、接続する際にホスト名等を指定する方法は以下の4通りがあります。

指定方法 ホスト名 ポート番号 データベース名 ユーザ名 パスワード
デフォルト値 127.0.0.1 5432 OS のユーザ名 OS のユーザ名 -
引数 -h, --host -p, --port -d, --dbname -U, --username -
パスワードファイル 1 2 3 4 5
環境変数 PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD

値が指定されなかった場合、デフォルトの値が適用されます。プロンプト、パスワードファイル、環境変数でそれぞれ別の値を指定した場合、どの値が優先されるのかは調べてないので分かりません。

psql ってなんだ?

以下の2つがポイントかなと思いました。

  1. psql クライアントと PostgreSQL サーバを区別する
  2. psql クライアントと psql コマンドを区別する

psql クライアントは PostgreSQL サーバを操作するための対話端末 interactive terminal です。psql クライアンはそれ1つでアプリとして動作します。

psql - PostgreSQL interactive terminal

psql クライアントは、自分のパソコンのなかで動いている PostgreSQL サーバだけではなく、ネットワーク上にいるほかのパソコンで動いている PostgreSQL サーバも操作できます。これは psql コマンドでホスト名やポート番号を指定できることからもわかります。

そして psql クライアントは psql コマンドで起動することができます。psql はクライアントです。データベースが動いているサーバとは違うものです。ややこしいのですがサーバとクライアントを区別すると良いような気がします。

以下のリンクの中で "PostgreSQL Client Applications" の一覧の中に psql コマンドがあるのがわかります。つまり psql はクライアントということです。

PostgreSQL Client Applications - PostgreSQL: Documentation

自分は サーバとクライアントが別物であると言う意識が希薄になっていました。これは psql コマンドが、なにも指定しないと自動的に localhost, 127.0.0.1 にある PostgreSQL サーバに接続されるからです。

Python での PostgreSQL 接続方法

もはや psql 関係ないですが...

◯ psycopg2 の書式

import psycopg2

connection = psycopg2.connect(
    user="postgres",
    password="secret",
    host="localhost",
    dbname="postgres"
)

◯ SQLAlchemy の書式

from sqlalchemy import create_engine

# dialect[+driver]://user:password@host/dbname[?key=value..]
URL = "postgresql+psycopg2://ユーザ名:パスワード@ホスト名/データベース名"
engine = create_engine(URL)

URL は RFC1738 に定められた書式だそうです(PEP 249 で定められてはいない、Python に限定して言えば SQLAlchemy の中だけで使われていそうな気配を感じます)。

The string form of the URL is dialect[+driver]://user:password@host/dbname[?key=value..], where dialect is a database name such as mysql, oracle, postgresql, etc., and driver the name of a DBAPI, such as psycopg2, pyodbc, cx_oracle, etc. Alternatively, the URL can be an instance of URL.

36
28
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
28