prisma複数データベースの接続方法
追加分のデータベースの接続情報を指定したschemaServiceB.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")
}
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 } },
});
- 既存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ファイルを作成する
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")
}
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 } },
});
- 既存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