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

j0pj023g  于 2023-05-06  发布在  Node.js
关注(0)|答案(4)|浏览(547)

我从视频教程和官方文档中学习Prisma ORM。他们解释并将所有模型代码写在一个名为schema.prisma的文件中。这是确定的,但是,当应用程序的增长,它变得混乱。那么,我应该如何将模型定义分离到单独的文件中呢?

huus2vyu

huus2vyu1#

目前Prisma不支持文件分割。我可以推荐三个解决方案。

选项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分割。

选项二: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");

用户模型内部

// 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 -〉Generate

将模式分割成块部分文件名并运行:

cat *.part.prisma > schema.prisma
yarn prisma generate

其中大部分(如果不是全部的话)都在当前公开的关于Prisma模式文件分段https://github.com/prisma/prisma/issues/2377支持的问题中引用

g6ll5ycj

g6ll5ycj2#

这在Prisma中是不可能的。有关可能的解决方法https://github.com/prisma/prisma/issues/2377,请参阅此未解决问题。

uxhixvfz

uxhixvfz3#

有一个名为Prismix的库,它允许您根据需要编写任意多个模式文件,这里是link

gmol1639

gmol16394#

可以在生成之前将所有架构合并为一个架构
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

相关问题