MacでPostgreSQLを試す（node.jsからも接続してみる）


ずっとMySQL使ってきたが、諸事情によりPostgreSQLを使うこともありそうなのでメモ。
とりあえずMacのローカル環境で動作確認。

## インストール

brewでインストールできる。

```bash
brew intall postgresql
```

>実体は/usr/local/var/posgtresql@14以下にインストールされるみたい。

## 動作確認（クライアント）

まずはクライアントツールであるpsqlが動くか確認。

```bash
psql --version

psql (PostgreSQL) 14.5 (Homebrew)
```

>2022年11月上旬時点では14.5が入る。

## PostgreSQLの起動・確認・終了

### 起動

```bash
brew services start postgresql@14
```

> brew servicews start postgresqlでもいけるがWarningが出る。複数バージョンに対応するためかな。


### 確認

動いてるサービスの確認。

```bash
brew services list
```

### 終了

```bash
brew services stop postgresql@14
```

>再起動はbrew services restart posgtresql@14。

## 基本的な使い方（DB全体）

### どんなDBが存在するか

```bash
psql -l
```

### ログイン


以下が基本系。


```bash
psql -h localhost -p 5432 -U username -d postgres
```

>brewでインストールした場合、インストールしたOSのユーザー名がsuperuserとして作成されるみたい。Linuxとかだとpostgresというユーザーが作られることが一般的。

ただ、ローカルホスト（というかUnixドメインソケット）の場合はいろいろ省略できるみたい。

>pg_hba.confの設定依存。


多くの場合、以下でログイン可能。


```bash
psql postgres
```


### ユーザーの確認

```bash
=# \du
```

### パスワードの設定

いくつかの方法があるようですが、とりあえず以下を試す。

```bash
=# alter user username with encrypted password 'P@ssw0rd';
```

## 外部からのアクセスを許可

### ユーザーの作成（任意）

createuserコマンドを利用するパターン。

```bash
$ createuser -U postgres dbuser
```

postgres等にログイン後、実行するパターン。

```bash
postgres=# create role dbuser with encrypted password 'P@ssw0rd';
```

### パスワードの設定

```bash
=# alter user dbuser with encrypted password 'P@ssw0rd';
```

### 権限付与

```bash
=# alter role dbuser with superuser;
```

### ファイルの編集

#### postgresql.conf

```bash
listen_addresses = '*'
port = 5432
```

#### pg_hba.donf

IPv4 local connections:に以下を追記。

```bash
# IPv4 local connections:
host    all             all             0.0.0.0/0               md5
```

```bash
host    testdb          dbuser          192.168.0.0/24          md5
```

### 再起動（設定反映）

```bash
brew services restart postgresql@14
```

### アクセス（リモート）

```bash
psql -h 192.168.0.99 -U dbuser -d testdb;
```

## 基本的な使い方（SQL）

### データベースの作成

DBにログインせずに作る。

```bash
$ createdb -U dbuser testdb
```

DB（postgres等）にログイン後に作る（こちらが一般的？）。

```bash
postgres=# create database testdb;
```

### デーベースの削除

```bash
postgres=# drop database testdb;
```

### テーブルの作成

```sql
create table members(
	id serial,
	name text,
	age int,
	primary key(id)
);
```

### テーブルの確認

```bash
\dt;
```

```bash
\d members;
```

### データの挿入（まあ、あまり意味ないけど）

```sql
insert into members(name,age) values('hoge',10);
insert into members(name,age) values('foo',20);
```

### テーブルの削除

```bassh
drop table members;
```

### データベースの削除

ちなみに自分自身は削除できない。まあ、当たり前。

```bash
testdb=# drop database testdb;
```

postgres等で入り直し削除。

```bash
postgres=# drop database testdb;
```

## node.jsからアクセスしてみる（おまけ）

### 準備

pg_hba.confを編集してパスワード認証にする。

必要な箇所のtrust → md5 とする。

>わからなければ全て。


### 実装

とりあえずデータを取得してみる。

#### 作業場作成

```bash
cd
mkdir pg_node
cd pg_node
```

#### モジュールのインストールと実装ファイルの作成

```bash
npm install pg
touch index.js
```

#### コードを書く

```js:index.js
const { Client } = require("pg");

const client = new Client({
    user: "dbuser",
    host: "localhost",
    database: "testdb",
    password: "P@ssw0rd",
    port: 5432
});

client.connect();

const query = {
    text: "select * from members",
    values: [],
}

client.query(query, (err, res) => {
    if (err) {
        console.log(err.stack);
    } else {
        res.rows.map(row => console.log(`${row.id} ${row.name}`));
    }
    client.end();
});
```

#### 実行

```bash
node index.js


1 hoge
2 foo
```

#### Express等でpgを使う場合

Poolを使うみたい。

>接続情報が違うのはご愛嬌。


```js
const express = require("express");
const { send } = require("express/lib/response");
const app = express();

const pg = require("pg");

const pool = new pg.Pool({
    user: "postgres",
    host: "localhost",
    database: "postgres",
    password: "postgres",
    port: 5432
});

app.get("/", (req, res) => {
    res.send("Hello Node.js");
});

app.get("/members", (req, res) => {

    pool.connect((err, client) => {
        if (err) {
            res.send(err.stack);
        } else {
            const query = {
                text: "select * from members",
                values: [],
            };
            client.query(query, (error, response) => {
                if (error) {
                    res.send(error.stack);
                } else {
                    res.json(response.rows);
                }
            })
        }
    });

})

app.listen(3000, () => {
    console.log("Start server on port 3000.");
});
```



## 参考

* https://amateur-engineer.com/postgresql-mac-install/
* https://qiita.com/bonjiri/items/47529a69540461d2cb0f