Nodejs の postgresql ドライバ (Sequelize, Prisma) を少し触ってみた。

**@kenmaro**です。
普段は主に**秘密計算、準同型暗号などの記事について投稿しています**。
秘密計算に関連するまとめの記事に関しては以下をご覧ください。

> - [秘密計算エンジニアを始めて１年が経った。](https://qiita.com/kenmaro/items/416657efca2ff296169b)
-  [秘密計算エンジニアを始めて２年半が経った。](https://qiita.com/kenmaro/items/48059dd60f79e80f5ef8)

## 概要
Nodejs のドライバを使ってpostgresqlに接続するテストを行った際に、
どのようなドライバやライブラリ、フレームワークがあるのかを調べたので簡単に備忘録的にまとめてみます。

## 初めにまとめ
いくつかDBドライバ的なものは存在して、有名なものも幾つかありましたが、
この二つが中でも有名なようでした。

- Sequelize

DBへのORMをもったライブラリであり、簡単に接続したいのであればこれを使うのが良さそうです。


- Prisma

ライブラリというよりはフレームワーク的な感じでいろいろとフォルダ構成など必要になるようです。
ウェブアプリなどを構成する上でがっつりと開発するなら使ってみてもいいでしょう。
かなり人気が高まっているようです。

どちらも試してみたのですが、
私の場合目的がサクッと試すという目的だったため、Sequelize を最終的には主に使いました。


## 環境構築

postgresql はローカルに構築せず（してもいいですが、）、Docker を使ってサクッと開発環境を構築した方が簡単です。

```docker-compose.yml
version: "2"
services:
  mysql:
    restart: always
    image: mysql:latest
    ports: ["3306:3306"]
    environment:
      MYSQL_DATABASE: 'test'
      MYSQL_ROOT_PASSWORD: 'password'
      MYSQL_USER: 'postgres'
      MYSQL_PASS: 'password'
    volumes:
      - /mnt/data/mysql:/var/lib/mysql
  pgdb:
    container_name: pg_db
    image: postgres:latest
    ports: ["5432:5432"]
    environment:
      - POSTGRES_PASSWORD=password"
    command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
```

このように mysql やpostgresql を簡単に構築できるdocker-compose.yml を
作っておくととても便利ですね。

このymlと同階層で、

```
$docker-compose up -d pgdb
```

で開発postgresqlを立ち上げましょう。

立ち上げたら、psqlというクライアントCLIライブラリを使って接続テストしてみます。
デフォルトでは `postgres というユーザ` と `postgres というデータベース` が構築されており、
パスワードはdocker-compose で指定しているものです。

よって、接続コマンドは

```
psql -U postgres -h localhost -d postgres
```

となります。

このあと、自分で開発用のユーザを作ったり、開発用のデータベースを作ってもいいですし、
めんどくさければとりあえずデフォルトのユーザpostgres、データベースpostgres
を使ってもいいと思います。

psqlでいろいろDBをいじるコマンドは以前まとめたのでこの記事をご覧ください。

https://qiita.com/kenmaro/items/4a4f2e458589ba2de926


## Sequelize

公式はこちらから

https://sequelize.org/master/


導入には以下を参考にさせていただきました。

https://qiita.com/ksh-fthr/items/7bc66911fd5c7506deeb

コネクション確立のパラメターなどはこちらを参考に
https://sequelize.org/master/class/lib/sequelize.js~Sequelize.html#instance-constructor-constructor

実際にコネクトしてみます。
フォルダ構成などは関係なく、index.jsだけで実質大丈夫なのでサクッと試せます。

```
mkdir nodetest
cd nodetest
npm init -y
npm install --save sequelize
npm install --save pg pg-hstore
touch index.js
```

```index.js
const { Sequelize, Model, DataTypes, QueryTypes } = require('sequelize');
//const sequelize = new Sequelize('sqlite::memory:');
const sequelize = new Sequelize('postgres', 'user', 'password', {
  host: 'localhost',
  port: 8088,
  dialect: 'postgres',
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  }
});

class Test extends Model {}
Test.init({
  c1: DataTypes.STRING,
}, { sequelize, modelName: 'test' });

(async () => {
  await sequelize.sync();
  //const res = await Test.findAll();
  //const res = await sequelize.query(`SELECT * FROM "test"`, { type: QueryTypes.SELECT });
  const res = await sequelize.query('SELECT id FROM "test"', { type: QueryTypes.SELECT });
  console.log("here done");
  console.log(res);
  //const jane = await Test.create({
  //  username: 'janedoe',
  //});
  //console.log(jane.toJSON());
})();


```

```
node index.js
```

これでクエリ結果を受け取ることができるはずです。


## Prisma

Prisma についてはまだそこまで記事が多くないイメージでしたが、
私は上二つの記事をフォローして触ってみるのが一番しっくりきました。

https://zenn.dev/tatsurom/articles/prisma-tutorial-from-scratch

https://blog.appsignal.com/2021/07/21/how-to-get-started-with-prisma-orm-for-nodejs-and-postgresql.html

しかしながら、ちょっとサクッと試すにはステップが多いかなあと思いました。。

https://www.prisma.io/docs/concepts/components/prisma-client/select-fields


## まとめ
最近は個人的にはfirebase をひたすら使っており、久しぶりにnodejsのライブラリについて調べてみましたが、
なかなか面白かったです。

他の言語のドライバについても調べてみようかな、、


今回はこの辺で。

@kenmaro