49
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

psql での PostgreSQL サーバーへのログインと接続

Last updated at Posted at 2020-03-26

方法 1. コマンドの引数

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

psql

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

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

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

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

◯ デフォルト値

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

◯ Docker を使用している場合

詳細

接続先のホストがローカルの場合は、デフォルト値であっても -h localhost または -h 127.0.0.1 を明示してログインしてください。そうしないと以下のようなエラーに遭遇します。理由も記載しました。

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

詳細

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

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

方法 2. 環境変数

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

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

詳細

矢印キー を使って履歴からコマンドを再利用するときにパスワードを打たなくてよくなるので便利かなと思います。

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

◯ 注意

詳細

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

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

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

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

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

コロン : で区切ります。

ファイルの書式
ホスト:ポート:データベース名:ユーザ名:パスワード
ファイルの場所
1. macOS, Ubuntu の場合
  ~/.pgfile

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

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

◯ 注意

詳細

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

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

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

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

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

おわりに

◯ まとめ

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

◯ psql ってなんだ?

PostgreSQL サーバー(1).jpg

  • 登場人物
    1. PostgreSQL サーバー
      • 説明省略
    2. psql クライアント
      • PostgreSQL サーバーを操作するアプリ
    3. psql コマンド
      • psql クライアントを起動し PostgreSQL サーバにログインするコマンド
      • 上図には書かれていません。
  • 実行順序
    1. psql コマンドで psql クライアントが起動します
    2. psql クライアントで PostgreSQL サーバーにログインします
    3. psql クライアントで PostgreSQL サーバーを操作します(上図はここを表しています)

psql は PostgreSQL の ターミナル ベースのフロントエンドです。対話 的にクエリを入力し、PostgreSQL に発行し、そのクエリ結果を見ることができます。
psql is a terminal-based front-end to PostgreSQL. It enables you to type in queries interactively, issue them to PostgreSQL, and see the query results.

詳細

psql クライアントは psql コマンドで起動することができます。psql クライアントは自分のパソコンのなかで動いている PostgreSQL サーバだけではなく、ネットワーク上にいるほかのパソコンで動いている PostgreSQL サーバも操作できます。

このことは psql コマンドでホスト名やポート番号を指定できることからもわかります。自分は初めて PostgreSQL を触っていたときにサーバとクライアントは別物であることがわからず混乱していました。その原因は psql コマンドが何も指定しないと自動的に localhost, 127.0.0.1 にある PostgreSQL サーバに接続されるからではないかと思っています。

psql はクライアントです。PostgreSQL はサーバです。ややこしいのですがサーバとクライアントを区別すると良いような気がします。以下のリンク "PostgreSQL Client Applications" の一覧の中に psql コマンドがあり、 psql はクライアントに分類されていることがわかります。


◯ 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.

49
40
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
49
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?