$ brew install postgresql
$ brew services start postgresql
$ brew services restart postgresql
$ ps aux | grep postgres
/usr/local/opt/postgresql/bin/postgres -D /usr/local/var/postgres
これの-Dの中に入ってる
$ psql $db_name $user_name
$ psql -h $host -p $port -U $user_name $db_name
> SELECT * FROM pg_settings WHERE name = 'port';
> \q
> SELECT current_user;
> \du
> SELECT * from pg_user;
> CREATE ROLE username WITH LOGIN PASSWORD 'quoted password' [OPTIONS]
今のロールがCREATEROLE権限を持っているかsuper userじゃ無いとこれは出来ない。
> ALTER USER user_name with SUPERUSER;
これを実行できるのはsuper userだけ super userではなくするにはwith NOSUPERUSER
> \password user_name
ただし、この設定よりもpg_hba.confの設定の方が強い。 methodがtrustになってる接続経路ではパスワード設定は意味が無くなる また、localhostはUNIXドメインソケット、127.0.0.1はIPv4で繋がる模様。passwordにすれば平文が使われる。
> SET password_encryption = 'scram-sha-256';
> SELECT * from pg_authid;
これでrolpasswordの種別を確認。適宜\password user_name
でアップデート。
pg_hba.confでmethodをscram-sha-256にすればその接続経路はこれでエンコードされる
> ALTER ROLE user_name CREATEDB;
複数貼り付ける場合はスペース区切り。剥がす時は項目名の前にNOを付ける https://www.postgresql.org/docs/9.5/static/sql-alterrole.html
> SELECT * FROM pg_stat_activity;
> SELECT pg_cancel_backend(process_id);
> SELECT current_database();
> CREATE DATABASE database_name;
> \l
> \connect database_name
> ALTER DATABASE database_name RENAME TO changed_database_name;
これはオーナー、またはsuperuserじゃないと出来ない。
> GRANT ALL PRIVILEGES ON DATABASE database_name TO user_name;
スキーマは簡単に言えば権限管理できるディレクトリのようなものに相当する。ただし、入れ子には出来ない。スキーマに属さない全てのテーブルは暗黙のpublicスキーマに属する。というより、デフォルトのsearch_pathがpublicになっている。publicスキーマは最初にあるというだけの第一市民なので、set search_pathで無視出来るし削除すら出来る。pg_で始まるスキーマは予約されている。
> SHOW search_path;
デフォルトは$user
, public
> SET search_path TO public, my_schema;
カンマ区切りで与えて、上書き
> REVOKE CREATE ON SCHEMA schema_name FROM user_name;
逆はGRANT TO
。PUBLIC
をuser_nameの代わりに使うと全員から奪える
> \dn
> SELECT * FROM pg_catalog.pg_namespace;
> CREATE SCHEMA schema_name;
> DROP SCHEMA schema_name;
中身がある時は
> DROP SCHEMA schema_name CASCADE;
> SELECT EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name='table_name');
> \dt
スキーマをワイルドカードで指定して絞り込む
> \dt schema_name.*
スキーマ単位で調べる別の方法
> SELECT * FROM information_schema.tables WHERE table_schema = s'chema_name'
> \d table_name
$ pg_dump database_name -Uuser_name -s -t table_name
> SET TIMEZONE TO 'Japan';
queryオブジェクトのnameフィールドを入れればprepared statementとして記憶してくれる
await client.query({ text: 'SELECT NOW()', name: foobar })
queryオブジェクトにvaluesを入れる
await client.query({ text: 'SELECT $1::text', values: ['fobar']})
ProwMode: 'array'
をqueryオブジェクトに追加