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