Node.jsのPrismaからIBMCloudDatabasesForEnterpriseDBに接続する

# やりたいこと

IBM Cloud Databases for EnterpriseDB（以下EDB）上で作られたDBがある。
Node.jsのORM `Prisma` を使って、このDBにアクセスしたい。

# 前提

* EDBのインスタンスが立ち上がっていて、`gold_kiwi` （※）というDBがある。
    * DBには、すでにいくつかテーブルが作られている。
* 利用環境は下記の通り。
    * Node.js: 20.3.1
    * Prisma: 5.2.0
* [こちら](https://www.prisma.io/docs/getting-started/setup-prisma/add-to-existing-project/relational-databases-typescript-postgresql)のチュートリアルに沿って、Prismaのインストールとinitまで終わっているものとする。

※ お寝坊さんのチームメンバーが「良い睡眠が取れますように」という願いを込めて、この名前になりました。。

# ゴール

* `npx prisma db pull`でPrisma schemaが更新されれば、接続成功とする。<br>（テーブル作りが先行していたので、今回はmigrationを使わないことにしました。）

# 実施した内容

## EDB

### サービスクレデンシャルを準備
1. IBM Cloudの管理画面で、EDBのインスタンスを開きます。
2. `Service credentials` の `New credential` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/c7dfac7e-8274-625b-6e16-667879a0a02b.png)
3. ダイアログが開くので、 `Name` に任意の名前を入力して、 `Add` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/27c136bf-35f9-d10e-94ec-2ad9d4920e06.png)
4. クレデンシャルが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/8bd7319d-1f45-c389-fa22-10f58c6291c6.png)
5. 追加したクレデンシャルをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/66d86e1c-af6f-8a1e-eb73-871aa0dd8a96.png)
6. 適当なテキストエディタを開いて、コピーした内容を貼り付けます。<br>中身はJsonになっています。<br>要素 `postgres` にユーザー名とパスワードが入っているので、控えておいてください。
```
    "postgres": {
      "authentication": {
        "method": "direct",
        "password": "XXXX", ← パスワード
        "username": "YYYY" ← ユーザー名
      },
```

### 接続情報を調べる

1. IBM Cloudの管理画面で、EDBのインスタンスを開きます。
2. `Overview` > `Endpoints` の `PostgreSQL` タブを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/5dbf2c8a-8c60-159b-51a6-07fc8e73574c.png)
3. Endpointをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551607/ff54aeff-2b5e-e585-9e89-5c0bafa8d4e7.png)
4. テキストエディタを開いて、コピーした内容を貼り付けます。<br>おそらく中身はこんな感じになっているので・・・
```
postgres://$USERNAME:$PASSWORD@[Hostnameが自動転記されている]:[Portが自動転記されている]/[Databaseが自動転記されている]?sslmode=verify-full
```
クレデンシャルとDB名を書き換えます。<br>（HostnameやPortがセットされていなかったら、これらもEndpointsの情報を転記しておきましょう。）
```
postgres://XXXX:YYYY@[Hostnameが自動転記されている]:[Portが自動転記されている]/gold_kiwi?sslmode=verify-full
```

## Prisma（Node.js）

`npx prisma init` したフォルダの直下に `.env`ファイルがあるので、DATABASE_URLを先ほど作った接続情報で置き換えます。
```
DATABASE_URL="postgres://XXXX:YYYY@[Hostnameが自動転記されている]:[Portが自動転記されている]/gold_kiwi?sslmode=verify-full"
```
`.env`を保存して閉じたら、`npx prisma db pull`を実行！  
こんな感じのメッセージが出れば、接続成功です。
```
Prisma schema loaded from prisma/schema.prisma
Environment variables loaded from .env
Datasource "db": PostgreSQL database "gold_kiwi", schema "public" at "～～～～"

✔ Introspected 8 models and wrote them into prisma/schema.prisma in 2.39s

*** WARNING ***

The following models were ignored as they do not have a valid unique identifier or id. This is currently not supported by Prisma Client:
  - "comment"
  - "discuss"
  - "project"
  - "user_info"

Run npx prisma generate to generate Prisma Client.
```
`prisma/schema.prisma`を開きます。<br>Prismaスキーマが作られていたので、DBから情報を取得できたことを確認できました。
```
/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by Prisma Client.
model comment {
  comment_id       Int      @default(autoincrement())
  discuss_id       Int
  project_id       Int
  content          String   @db.VarChar(200)
  is_like          Boolean?
  create_user_id   Int
  create_timestamp DateTime @default(now()) @db.Timestamp(6)
  update_timestamp DateTime @default(now()) @db.Timestamp(6)

  @@ignore
}
```

# 引っ掛かりポイント

* ユーザー名とパスワードの取得方法でしょうか？