方法 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
に書き換えます。パスワードが無効になります。
# 変更前
# 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. 環境変数
export PGHOST=ホスト
export PGPORT=ポート番号
export PGDATABASE=データベース名
export PGUSER=ユーザ名
export PGPASSWORD=パスワード
psql
set PGHOST=ホスト
set PGPORT=ポート番号
set PGUSER=ユーザ名
set PGDATABASE=データベース名
set PGPASSWORD=パスワード
psql
$env:PGHOST="ホスト"
$env:PGPORT="ポート番号"
$env:PGUSER="ユーザ名"
$env:PGDATABASE="データベース名"
$env:PGPASSWORD="パスワード"
psql
◯ ワンライナーでログインしたい場合
詳細
矢印キー ↑
を使って履歴からコマンドを再利用するときにパスワードを打たなくてよくなるので便利かなと思います。
PGPASSWORD=パスワード psql -U ユーザ名 データベース名
# ワンライナーでは書けないので2行で書いてください...orz
set PGPASSWORD=パスワード
psql -U ユーザ名 データベース名
$env:PGPASSWORD="パスワード"; psql -U ユーザ名 データベース名
◯ 注意
詳細
この「方法 2. 環境変数」も便利な気がしますが...
psql の対話シェルではなく直接 OS の対話シェルにパスワードを書いた場合、コマンドの履歴にパスワードが残ります。例えば bash の場合 ~/.bash_history
にコマンドが保存されます。もしかしたらほかにもどこかで保存されているかもしれず詳しいことは存じておりません。ほかの人がそのコマンドの履歴を見られる可能性があることに留意してください。これを避けたい場合
- 以下のように OS の対話シェルにはパスワードを書き込まない、または
- システムレベルで提供されているキーストア(例: macOS の Keychain、Linux の Secret Service API)を利用する
ことなどを検討してください。
方法 3. パスワードファイル
コロン :
で区切ります。
ホスト:ポート:データベース名:ユーザ名:パスワード
1. macOS, Ubuntu の場合
~/.pgfile
2. Windows の場合
%APPDATA%\postgresql\pgpass.conf
3. あるいは環境変数 PGPASSFILE でファイルパスを指定できます。
◯ 注意
詳細
この「方法 3. パスワードファイル」はログインするたびにユーザ名などを入力するのが面倒な場合は便利な気がしますが...
パスワードをファイルに直接書き込む場合、ほかの人がそのファイルを見られる可能性があることに留意してください。これを避けたい場合
- ファイルにパスワードを保存しない、または
- ファイルに閲覧の制限をかける(例: 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 サーバー
- 説明省略
- psql クライアント
- PostgreSQL サーバーを操作するアプリ
-
psql
コマンド- psql クライアントを起動し PostgreSQL サーバにログインするコマンド
- 上図には書かれていません。
- PostgreSQL サーバー
- 実行順序
-
psql
コマンドで psql クライアントが起動します - psql クライアントで PostgreSQL サーバーにログインします
- 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.