Prisma normally limits your schema to one file, but with prisma-multischema, you can write multiple prisma schema files in an organized manner without any restrictions.
For Multiple files inter-relation you can import schemas , to manage the relation.
Built using TypeScript to for ES Module and CommonJS (CJS), to Unify Multiple Structured Schemas of Prisma-ORM
npm i prisma-multischema
yarn add prisma-multischema
Note Using VS Code ? Install Recommended VsCode Extensions from Dependencies (optional)
𝙻𝚎𝚊𝚟𝚎 𝚊 𝚂𝚝𝚊𝚛⭐ 𝚘𝚗 𝚝𝚑𝚎 𝚁𝚎𝚙𝚘 ,𝚒𝚏 𝚢𝚘𝚞 𝚏𝚘𝚞𝚗𝚍 𝚒𝚝 𝚑𝚎𝚕𝚙𝚏𝚞𝚕.
𝚂𝚞𝚙𝚙𝚘𝚛𝚝𝚜 𝚊𝚗𝚍 𝚏𝚎𝚎𝚍𝚋𝚊𝚌𝚔 𝚖𝚎𝚊𝚗𝚜 𝚊 𝚕𝚘𝚝 𝚊𝚗𝚍 𝚎𝚗𝚌𝚘𝚞𝚛𝚊𝚐𝚎𝚜 𝚖𝚎❤️.
-
How to Use Tutorial : 📚MediumBlog || ✨YT Link
-
Place all your schemas in
ProjectRoot/prisma/subschemas
Folder.
Like this :project_root ├───node_modules ├───prisma │ ├───subschemas <<<-----Place all your Schemas here │ │ ├───type │ │ │ └───user.types.prisma │ │ │ └───bookmark.types.prisma │ │ └───user │ │ │ └───userData.prisma │ │ │ └───validity.prisma │ │ ├───anything-you-want.prisma │ │ ├───base.prisma | | └───... │ └───schema.prisma <-- will be Auto-Generated ├───src │ └───... ├───package.json │ └───.gitignore
For Clearer View : Image
-
Run in Terminal
npx prisma-multischema
working example is available below -
- JavaScript : Prisma-MultiSchema-JS-Example
- TypeScript : Prisma-MultiSchema-TS-Example
Let's go with two schemas User and Bookmark on different files ,where the relation is -
- A User can have many bookmarks
- Each bookmark has an userId field
base.prisma [ root/prisma/subschemas/base.prisma ]
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mongodb"
url = env("PRISMA_DATABASE_URL")
}
user.prisma [ root/prisma/subschemas/User/user.prisma ]
import { Bookmark } from "..\Bookmark\bookmark"
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
Bookmark Bookmark[]
}
//MongoDB model IDs in prisma -must have a @map("_id")
//https://www.prisma.io/docs/concepts/components/prisma-schema
bookmark.prisma [ root/prisma/subschemas/Bookmark/bookmark.prisma ]
import { User } from "..\User\user"
model Bookmark {
id String @id @db.ObjectId @default(auto()) @map("_id")
title String
user User @relation(fields: [userId], references: [id])
userId String @db.ObjectId
}
Generated schema.prisma [root/prisma/schema.prisma]
after Runningnpx prisma-multischema
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mongodb"
url = env("PRISMA_DATABASE_URL")
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
Bookmark Bookmark[]
}
model Bookmark {
id String @id @default(auto()) @map("_id") @db.ObjectId
title String
user User @relation(fields: [userId], references: [id])
userId String @db.ObjectId
}
-
prisma schema files starting with header
//#exclude
will be excluded in final schema -
Executing
npx prisma-multischema
will- Automatically run :
npx prisma generate
So, You don't need to update@prisma/client
manually, each time the schema updates - Automatically run :
npx prisma format
because, Everyone likes clean code
- Automatically run :
-
Add
npx prisma-multischema
command as a prefix to your start script in package.json.{ "name": "my-app", "version": "1.0.0", "scripts": { "unify": "npx prisma-multischema", "start": "npm run unify && node index.js", ... } }
Now it will run & regenerate Main Schema everytime the project starts.
To use prisma import feature : (if you are using VS code, its better to use these)
-
Install prisma-import Extension (for VS code)
-
Disable Official prisma Extension (for VS code)
These are Optional Dependencies, If you can maintain multiple *.prisma schemas without TYPO ,you can ignore these.
-
Add Support for keeping prisma's in different folder and aggregate them ( like
root/src/auth/auth.prisma
) -
Add Command Flags
-
Handle/RemoveFixed" Error validating datasource db: "
Warning