
toquiz 프로젝트에서 RDB(MySQL)과 NoSQL(MongoDB)를 같이 사용하고자 한다. 이유는 다음과 같다.
User, Panel, Question, AnswertoquizUsermongodb, mysql schema를 각각 생성한다.
MONGODB_DATABASE_URL, MYSQL_DATABASE_URL을 각각 다음과 같은 형식으로 생성db://USERNAME:PASSWORD@HOST/DATABASEgenerator client {
provider = "prisma-client-js"
output = "./generated/mysql"
}
datasource db {
provider = "mongodb"
url = env("MONGODB_DATABASE_URL")
}
model ToquizModel {
id String @id @default(auto()) @map("_id") @db.ObjectId
pannelId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}generator client {
provider = "prisma-client-js"
output = "./generated/mongodb"
}
datasource db {
provider = "mysql"
url = env("MYSQL_DATABASE_URL")
}
model User {
id String @id @default(uuid())
pannels Pannel[]
answers Answer[]
scrappedPannels Scrap[]
username String
password String
nickname String
provider String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt()
deletedAt DateTime?
}
model Scrap {
user User @relation(fields: [userId], references: [id])
userId String
pannel Pannel @relation(fields: [pannelId], references: [id])
pannelId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt()
deletedAt DateTime?
@@id([userId, pannelId])
}
model Pannel {
id Int @id @default(autoincrement())
user User @relation(fields: [userId], references: [id])
userId String
scrappedUsers Scrap[]
questions Question[]
describe String
isArchived Boolean @default(false)
scrapNum Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
}
model Question {
id Int @id @default(autoincrement())
pannel Pannel @relation(fields: [pannelId], references: [id])
pannelId Int
answers Answer[]
content String
answerNum Int @default(0)
likeNum Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
}
model Answer {
id Int @id @default(autoincrement())
User User @relation(fields: [userId], references: [id])
userId String
Question Question @relation(fields: [questionId], references: [id])
questionId Int
content String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
}
yarn generate를 통해 ./prisma/client 생성
yarn generate —schema ./prisma/mysql.schema.prismayarn generate —schema ./prisma/mongodb.schema.prisma./generated/{db이름} 으로 설정했기 때문에 다음과 같이 생성된다. 
PrismaService 생성

import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '../../prisma/generated/mongodb';
@Injectable()
export class MongodbPrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect();
}
async enableShutdownHooks(app: INestApplication) {
this.$on('beforeExit', async () => {
await app.close();
});
}
}import { INestApplication, Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '../../prisma/generated/mysql';
@Injectable()
export class MysqlPrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect();
}
async enableShutdownHooks(app: INestApplication) {
this.$on('beforeExit', async () => {
await app.close();
});
}
}module에서 import 후 사용
import { Module } from '@nestjs/common';
import { MysqlPrismaService, MongodbPrismaService } from 'libs/prisma-service';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({
imports: [],
controllers: [UserController],
providers: [UserService, **MysqlPrismaService**, **MongodbPrismaService**],
})
export class UserModule {}추가)