>
Prismaで複数のデータベースを扱う方法について説明します。
Prismaをインストール・初期化します。
npm install prisma --save-dev
npm install @prisma/client
npx prisma init
Prismaをインストールします。
Prisma Clientをインストールします。
Prismaを初期化します。schema.prismaが生成されます。
Supabaseを例に説明します。以下のページを参考にして、環境変数を設定してください。
複数のプロジェクトのURLを設定します。
DATABASE_1_URL="postgres://postgres.aaaa:password@xxxx.example.com:6543/postgres?pgbouncer=true&connection_limit=1"
DIRECT_1_URL="postgres://postgres.aaaa:password@xxxx.example.com:5432/postgres"
DATABASE_2_URL="postgres://postgres.bbbb:password@xxxx.example.com:6543/postgres?pgbouncer=true&connection_limit=1"
DIRECT_2_URL="postgres://postgres.bbbb:password@xxxx.example.com:5432/postgres"
ここからの設定は、以下のページを参考にしています。
Multiple Connections / Databases / Datasources · Issue #2443 · prisma/prisma
データベースの数だけschemaファイルを作成します。schema.prismaのファイル名を変更し、複製してください。
generator client {
provider = "prisma-client-js"
output = "./generated/client1"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_1_URL")
directUrl = env("DIRECT_1_URL")
}
//...
generator client {
provider = "prisma-client-js"
output = "./generated/client2"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_2_URL")
directUrl = env("DIRECT_2_URL")
}
//...
既にデータベースがある場合は、データベースの定義からSchemaを作成します。
npx prisma db pull --schema prisma/schema1.prisma
npx prisma db pull --schema prisma/schema2.prisma
必要に応じて、Schemaを編集します。以下のコードは例です。
// 修正前
model posts {
id Int @id @default(autoincrement())
title String
content String
status String
user_id String
created_at DateTime @default(now())
updated_at DateTime @default(now())
}
// 修正後
model Post {
id Int @id @default(autoincrement())
title String
content String
status String
userId String @map("user_id")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @default(now()) @map("updated_at")
@@map("posts")
}
Prisma Clientを作成します。以下のコマンドを実行すると、.schemaファイルで設定したoutputのパスにコードが作成されます。
prisma generate --schema prisma/schema1.prisma
prisma generate --schema prisma/schema2.prisma
lib/prisma.tsを作成します。
import { PrismaClient as PrismaClient1 } from '@/prisma/generated/client1';
import { PrismaClient as PrismaClient2 } from '@/prisma/generated/client2';
export const prisma1 = new PrismaClient1();
export const prisma2 = new PrismaClient2();
import { prisma1, prisma2 } from "@/lib/prisma";
import { Post } from "@/prisma/generated/client1";
import { Book } from "@/prisma/generated/client2";
// ...
const posts: Post[] = await prisma1.post.findMany({
orderBy: {
createdAt: 'desc',
}
});
const books: Book[] = await prisma2.book.findMany({
orderBy: {
releaseDate: 'desc',
}
});
Prisma Studioを起動する際は、schemaのパスを指定する必要があります。
npx prisma studio --schema prisma/schema1.prisma
少し手間がかかりますが、これで複数のデータベースを扱えるようになります。