如何将 Prisma 模型分割成单独的文件?

问题描述 投票:0回答:6

我正在通过视频教程和官方文档学习 Prisma ORM。他们解释并将所有模型代码写入一个名为

schema.prisma
的文件中。没关系,但是当应用程序增长时,它就会变得混乱。那么,我应该如何将模型定义分离到单独的文件中?

sql node.js typescript orm prisma
6个回答
9
投票

目前 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


4
投票

Prisma 还无法做到这一点。请参阅此未决问题以获取可能的解决方法https://github.com/prisma/prisma/issues/2377


3
投票

prisma-import 是一个相对较新的解决方案,在我看来,也是最好的解决方案。它有自己的 Prisma VSCode 扩展分支,可实现良好的工作流程,使用类似于 JS 导入的导入语句。


1
投票

有一个名为 Prismix 的库,它允许您编写任意数量的架构文件,在这里您可以找到链接


1
投票

您可以在生成之前将所有模式合并为一个

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


0
投票

您可以查看我们正在构建的 Prisma 扩展库 ZenStack。该模式与 Prisma 模式完全兼容,并且会在底层转换为 schema.prisma。

https://zenstack.dev/docs/guides/multiple-schema

除了支持导入其他模式文件外,我们还支持模型继承,使您的模式DRY(不要重复)。例如,您可以拥有单独的架构文件。

© www.soinside.com 2019 - 2024. All rights reserved.