我正在通过视频教程和官方文档学习 Prisma ORM。他们解释并将所有模型代码写入一个名为
schema.prisma
的文件中。没关系,但是当应用程序增长时,它就会变得混乱。那么,我应该如何将模型定义分离到单独的文件中?
目前 Prisma 不支持文件分割。不过我可以推荐 3 个解决方案。
选项 1:Prismix
Prismix 利用模型和枚举通过 prismix 配置文件为 Prisma 架构创建跨文件关系。
{
"mixers": [
{
"input": [
"base.prisma",
"./modules/auth/auth.prisma",
"./modules/posts/posts.prisma",
],
"output": "prisma/schema.prisma"
}
]
}
将其放入 prismix.config.json 文件中,该文件将定义您希望如何合并 Prisma 分段。
选项 2:Schemix
Schemix 利用 Typescript 配置来处理模式分段。
例如:
// _schema.ts
import { createSchema } from "schemix";
export const PrismaSchema = createSchema({
datasource: {
provider: "postgresql",
url: {
env: "DATABASE_URL"
},
},
generator: {
provider: "prisma-client-js",
},
});
export const UserModel = PrismaSchema.createModel("User");
import "./models/User.model";
PrismaSchema.export("./", "schema");
User.model 内部
// models/User.model.ts
import { UserModel, PostModel, PostTypeEnum } from "../_schema";
UserModel
.string("id", { id: true, default: { uuid: true } })
.int("registrantNumber", { default: { autoincrement: true } })
.boolean("isBanned", { default: false })
.relation("posts", PostModel, { list: true })
.raw('@@map("service_user")');
这将生成包含完整架构的 prisma/schema.prisma。我仅使用一个数据库作为示例(取自文档),但您应该明白这一点。
选项 3: Cat -> 生成
将架构分割成块部分文件名并运行:
cat *.part.prisma > schema.prisma
yarn prisma generate
当前关于 Prisma 架构文件分段支持的开放问题中引用了其中的大多数(如果不是全部)https://github.com/prisma/prisma/issues/2377
Prisma 还无法做到这一点。请参阅此未决问题以获取可能的解决方法https://github.com/prisma/prisma/issues/2377。
prisma-import 是一个相对较新的解决方案,在我看来,也是最好的解决方案。它有自己的 Prisma VSCode 扩展分支,可实现良好的工作流程,使用类似于 JS 导入的导入语句。
有一个名为 Prismix 的库,它允许您编写任意数量的架构文件,在这里您可以找到链接
您可以在生成之前将所有模式合并为一个
yarn add -g glob
// package.json
"scripts": {
"prisma-concat": "npx ts-node prisma/concat-schemas.ts && npx prisma format",
"generate": "yarn prisma-concat && npx prisma generate",
}
// connect-db.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// prisma/concat-schemas.ts
import { appendFile, readFile, writeFile } from 'fs/promises'
import { glob } from 'glob'
const start = async () => {
const schemaFile = 'prisma/schema.prisma'
const connectFile = 'prisma/connect-db.prisma'
const models = await glob('src/**/*.prisma')
const files = [connectFile, ...models]
await writeFile(schemaFile, '')
await Promise.all(
files.map(async (path) => {
const content = await readFile(path)
return appendFile(schemaFile, content.toString())
}),
)
}
start()
然后运行
yarn generate
您可以查看我们正在构建的 Prisma 扩展库 ZenStack。该模式与 Prisma 模式完全兼容,并且会在底层转换为 schema.prisma。
https://zenstack.dev/docs/guides/multiple-schema
除了支持导入其他模式文件外,我们还支持模型继承,使您的模式DRY(不要重复)。例如,您可以拥有单独的架构文件。