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