Prisma: MultiSchema NPM
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)
Leave a Star⭐ on the Repo ,if you found it helpful.
Supports and feedback means a lot and encourages me❤️.
-
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 (削除ここまで)