フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

prismaで複数データベースに接続する手順

prisma複数データベースの接続方法

追加分のデータベースの接続情報を指定したschemaServiceB.prismaファイルを作成する

  • schema.prismaファイル(既存)
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("ServiceA_MySQL")
}
  • schemaServiceB.prismaファイル(追加分)
generator client {
  provider = "prisma-client-js"

}

datasource db {
  provider = "mysql"
  url      = env("ServiceB_MySQL")
}

DBの情報からスキマーファイルの生成

- DBの情報からスキマーを作成する
npx prisma db pull --schema prisma/schema.prisma
npx prisma db pull --schema prisma/schemaServiceB.prisma

npx prisma generate --schema prisma/schema.prisma
npx prisma generate --schema prisma/schemaServiceB.prisma

上記のコマンドを実行するとprismaフォルダ内に「generated」フォルダが作成される

prisma
├── client.ts
├── generated
│   ├── client
│   │   ├── index-browser.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── libquery_engine-debian-openssl-1.1.x.so.node
│   │   ├── runtime
│   │   │   ├── esm
│   │   │   │   ├── index-browser.mjs
│   │   │   │   ├── index.mjs
│   │   │   │   └── proxy.mjs
│   │   │   ├── index-browser.d.ts
│   │   │   ├── index-browser.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── proxy.d.ts
│   │   │   └── proxy.js
│   │   └── schema.prisma
│   └── clientServiceB
│       ├── index-browser.js
│       ├── index.d.ts
│       ├── index.js
│       ├── libquery_engine-debian-openssl-1.1.x.so.node
│       ├── runtime
│       │   ├── esm
│       │   │   ├── index-browser.mjs
│       │   │   ├── index.mjs
│       │   │   └── proxy.mjs
│       │   ├── index-browser.d.ts
│       │   ├── index-browser.js
│       │   ├── index.d.ts
│       │   ├── index.js
│       │   ├── proxy.d.ts
│       │   └── proxy.js
│       └── schema.prisma
├── schema.prisma
└── schemaServiceB.prisma

schemaファイルにoutputを追加する

  • generatedフォルダのパスを指定する
  • schema.prismaファイル
generator client {
  provider = "prisma-client-js"
    output   = "./generated/client"
}

datasource db {
  provider = "mysql"
  url      = env("ServiceA_MySQL")
}
  • schemaServiceB.prismaファイル
generator client {
  provider = "prisma-client-js"
 output   = "./generated/clientServiceB"
}

datasource db {
  provider = "mysql"
  url      = env("ServiceB_MySQL")
}

prisma/client.tsファイルを修正する

  • 修正前
import { PrismaClient } from "@prisma/client";
const {
  ServiceA_MySQL,
} = process.env

const prisma = new PrismaClient({});
  • 修正後

各クライアントのインスタンス生成時にdatasourceを指定する。指定しないとうまくDB接続できませんでした。

import { PrismaClient  } from './generated/client'
import { PrismaClient as ServiceBPrismaClient } from './generated/clientServiceB'
const {
  ServiceA_MySQL,
  ServiceB_MySQL
} = process.env

const prisma = new PrismaClient({
  datasources: { db: { url: ServiceA_MySQL } },
});

export const serviceBPrisma = new ServiceBPrismaClient({
  datasources: { db: { url: ServiceB_MySQL } },

});

prismaを利用している箇所の修正

  • 既存DBを参照しているprismaの箇所をgeneratedフォルダ内のclientファイルを利用するように修正する
-import { user, PrismaClient } from '@prisma/client'
+import { user, PrismaClient } from '../../../prisma/generated/client'
  • 追加分のDBを参照しているprismaの箇所はgeneratedフォルダ内のclientファイルを利用するようにする
import { user, PrismaClient as ServiceBPrismaClient } from '../../../prisma/generated/clientServiceB'

参考文献

prisma複数データベースの接続方法

追加分のデータベースの接続情報を指定したschemaServiceB.prismaファイルを作成する

  • schema.prismaファイル(既存)
generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("ServiceA_MySQL")
}
  • schemaServiceB.prismaファイル(追加分)
generator client {
  provider = "prisma-client-js"

}

datasource db {
  provider = "mysql"
  url      = env("ServiceB_MySQL")
}

DBの情報からスキマーファイルの生成

- DBの情報からスキマーを作成する
npx prisma db pull --schema prisma/schema.prisma
npx prisma db pull --schema prisma/schemaServiceB.prisma

npx prisma generate --schema prisma/schema.prisma
npx prisma generate --schema prisma/schemaServiceB.prisma

上記のコマンドを実行するとprismaフォルダ内に「generated」フォルダが作成される

prisma
├── client.ts
├── generated
│   ├── client
│   │   ├── index-browser.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── libquery_engine-debian-openssl-1.1.x.so.node
│   │   ├── runtime
│   │   │   ├── esm
│   │   │   │   ├── index-browser.mjs
│   │   │   │   ├── index.mjs
│   │   │   │   └── proxy.mjs
│   │   │   ├── index-browser.d.ts
│   │   │   ├── index-browser.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── proxy.d.ts
│   │   │   └── proxy.js
│   │   └── schema.prisma
│   └── clientServiceB
│       ├── index-browser.js
│       ├── index.d.ts
│       ├── index.js
│       ├── libquery_engine-debian-openssl-1.1.x.so.node
│       ├── runtime
│       │   ├── esm
│       │   │   ├── index-browser.mjs
│       │   │   ├── index.mjs
│       │   │   └── proxy.mjs
│       │   ├── index-browser.d.ts
│       │   ├── index-browser.js
│       │   ├── index.d.ts
│       │   ├── index.js
│       │   ├── proxy.d.ts
│       │   └── proxy.js
│       └── schema.prisma
├── schema.prisma
└── schemaServiceB.prisma

schemaファイルにoutputを追加する

  • generatedフォルダのパスを指定する
  • schema.prismaファイル
generator client {
  provider = "prisma-client-js"
    output   = "./generated/client"
}

datasource db {
  provider = "mysql"
  url      = env("ServiceA_MySQL")
}
  • schemaServiceB.prismaファイル
generator client {
  provider = "prisma-client-js"
 output   = "./generated/clientServiceB"
}

datasource db {
  provider = "mysql"
  url      = env("ServiceB_MySQL")
}

prisma/client.tsファイルを修正する

  • 修正前
import { PrismaClient } from "@prisma/client";
const {
  ServiceA_MySQL,
} = process.env

const prisma = new PrismaClient({});
  • 修正後

各クライアントのインスタンス生成時にdatasourceを指定する。指定しないとうまくDB接続できませんでした。

import { PrismaClient  } from './generated/client'
import { PrismaClient as ServiceBPrismaClient } from './generated/clientServiceB'
const {
  ServiceA_MySQL,
  ServiceB_MySQL
} = process.env

const prisma = new PrismaClient({
  datasources: { db: { url: ServiceA_MySQL } },
});

export const serviceBPrisma = new ServiceBPrismaClient({
  datasources: { db: { url: ServiceB_MySQL } },

});

prismaを利用している箇所の修正

  • 既存DBを参照しているprismaの箇所をgeneratedフォルダ内のclientファイルを利用するように修正する
-import { user, PrismaClient } from '@prisma/client'
+import { user, PrismaClient } from '../../../prisma/generated/client'
  • 追加分のDBを参照しているprismaの箇所はgeneratedフォルダ内のclientファイルを利用するようにする
import { user, PrismaClient as ServiceBPrismaClient } from '../../../prisma/generated/clientServiceB'

参考文献

https://www.memory-lovers.blog/entry/2021/10/13/113000
https://zenn.dev/frog/articles/073af49880452f
https://github.com/prisma/prisma/issues/2443