【问题标题】:How to seed with relationships in Prisma如何在 Prisma 中播种关系
【发布时间】:2022-02-18 02:17:52
【问题描述】:

我在 Prisma 中进行播种,我正在努力寻找不是超级基本的示例。在下面的示例中,我想创建一个User(作者),他创作了多个Services (1:n),并且每个Service 都可以来自一个Provider。

  • User - 1:n - Services
  • Services m:1 - Provider

在下面的示例中,创建过程会在 Provider 表上产生 3 个“AWS”实例。考虑到使用的语法,这很有意义。我想分别拥有 AWS、GCP 和 AZURE(我的提供商枚举)的一个记录。

另外,如果有人有一个更有说服力的例子来说明如何生成它以使种子更具可扩展性,请告诉我。

seed.ts

const main = async () => {
  await prisma.user.create({
    data: {
      email: "moderator@gmail.com",
      username: "timothy",
      role: "MODERATOR",
      authored: {
        create: [
          {
            name: "Simple Storage Service",
            acronym: "S3",
            provider: {
              create: {
                name: "AWS", // how can these all reference the same Provider table row?
              },
            },
          },
          {
            name: "DynamoDB",
            acronym: "DynamoDB",
            provider: {
              create: {
                name: "AWS",
              },
            },
          },
          {
            name: "API Gateway",
            acronym: "API Gateway",
            provider: {
              create: {
                name: "AWS",
              },
            },
          },
          {
            name: "BigQuery",
            acronym: "BigQuery",
            provider: {
              create: {
                name: "GCP",
              },
            },
          },
        ],
      },
    },
  });
};

schema.prisma

enum Providers {
  AWS
  GCP
  AZURE
}

enum Role {
  USER
  MODERATOR
  ADMIN
}

model User {
  id        Int       @id @default(autoincrement())
  email     String    @unique @db.VarChar(255)
  username  String    @unique @db.VarChar(255)
  role      Role      @default(USER)
  createdAt DateTime  @default(now())
  authored  Service[]
}

model Service {
  id         Int      @id @default(autoincrement())
  name       String   @unique @db.VarChar(255)
  acronym    String   @unique @db.VarChar(255)
  authorId   Int
  providerId Int
  author     User     @relation(fields: [authorId], references: [id])
  provider   Provider @relation(fields: [providerId], references: [id])
  createdAt  DateTime @default(now())
  updatedAt  DateTime @updatedAt
}

model Provider {
  id        Int       @id @default(autoincrement())
  name      Providers
  Services  Service[]
  createdAt DateTime  @default(now())
}

Provider 表中的当前结果。不应有“AWS”的重复(三次)。

【问题讨论】:

    标签: postgresql prisma prisma2


    【解决方案1】:

    只需预先创建提供程序,然后 connect 将其提供给服务:

    const main = async () => {
      const awsProvider = await prisma.providers.create({
        data: { name: 'AWS' }
      })
    
      await prisma.user.create({
        data: {
          email: "moderator@gmail.com",
          username: "timothy",
          role: "MODERATOR",
          authored: {
            create: [
              {
                name: "Simple Storage Service",
                acronym: "S3",
                provider: {
                  connect: awsProvider
                },
              },
    
    // ...
    
    

    【讨论】:

    • 它几乎可以正常工作,目前正在解决当前错误,当我尝试使用您的示例和种子时:未知 arg createdAt in data.authored.create.2.provider.connect.createdAt 类型 ProviderWhereUniqueInput。可用参数:类型 ProviderWhereUniqueInput {id?: Int}。我尝试使用awsProvider.id,但它不喜欢那样。嗯。
    • 当我使用:awsProvider.id 时返回以下错误:类型 'number' 不可分配给类型 'ProviderWhereUniqueInput |未定义'。
    • 我已经解决了这个问题并在下面创建了一个新的答案。感谢您为我指明正确的方向!
    【解决方案2】:

    我已经解决了这个问题,下面的示例显示了如何连接或关联种子中的表。

    这里是相关的Prisma docs。

    const main = async () => {
      const awsProvider = await prisma.provider.create({
        data: { name: "AWS" },
      });
      const gcpProvider = await prisma.provider.create({
        data: { name: "GCP" },
      });
    
      await prisma.user.create({
        data: {
          email: "moderator@gmail.com",
          username: "timothy",
          role: "MODERATOR",
          authored: {
            create: [
              {
                name: "Simple Storage Service",
                acronym: "S3",
                provider: {
                  connect: { id: awsProvider.id },
                },
              },
              {
                name: "DynamoDB",
                acronym: "DynamoDB",
                provider: {
                  connect: { id: awsProvider.id },
                },
              },
              {
                name: "API Gateway",
                acronym: "API Gateway",
                provider: {
                  connect: { id: awsProvider.id },
                },
              },
              {
                name: "BigQuery",
                acronym: "BigQuery",
                provider: {
                  connect: { id: gcpProvider.id },
                },
              },
            ],
          },
        },
      });
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 2012-08-02
      • 2018-09-10
      • 2021-08-21
      • 2019-01-05
      • 2019-10-20
      • 2020-01-28
      相关资源
      最近更新 更多