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