簡體   English   中英

如何在 prisma 中使用帶有外鍵的 createMany?

[英]How can I use createMany with foreign keys in prisma?

我是使用 Prisma 的初學者,並且一直試圖弄清楚如何最初將數據加載到 postgres 表中。 我已經嘗試按照這個示例在 prisma https://github.com/prisma/prisma-examples/tree/latest/javascript/graphql-auth中播種我的數據庫,但似乎 main() 沒有被命令“觸發” npx prisma db 種子 --preview-feature"。 因此,我嘗試通過臨時 function 插入我的數據庫,但在啟動開發服務器時出現無效調用錯誤:

Foreign key constraint failed on the field: Animals_categoryName_fkey (index)

但是當我不使用外鍵時,我沒有收到此錯誤。 下面是我的 schema.prisma、類型和我需要添加的數據。

Schema.prisma

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model Animals{
  id Int @id @default(autoincrement())
  image String
  price String
  description String[]
  stock Int
  onSale Boolean
  title String
  category Category @relation(fields: [categoryName], references: [categoryName])
  slug String @unique
  categoryName String
}

model Category{
  id Int @id @default(autoincrement())
  image String
  categoryName String @unique
  animals Animals[]
}

model MainCards{
  cardId Int @id @default(autoincrement())
  image String
  title String
}

類型定義——

const typeDefs = gql`
      type MainCard {
          title: String!
          image: String!
      }
    
      type Animals{
        id: ID!
        image: String!
        price: String!
        description: [String!]!
        stock: Int!
        onSale: Boolean
        slug: String
        categoryName: String
        title: String
      }
    
      type Category{
        id: ID!
        image: String!
        categoryName: String!
      }
    
      type Query {
        mainCards: [MainCard]
        animals: [Animals]
        animal(slug: String!): Animals
        categories: [Category]
        category(categoryName: String!): [Animals]
      }
    `;

要添加的部分數據:

const AnimalsData = async () => {
    await prisma.animals.createMany({
        data: [
            {
                image: "lion",
                title: "7-year Male Lion with Large Well Kept Main with a Beautiful Yellow/Brownish Color",
                price: "23,322",
                description: [
                    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
                    "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
                    "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
                    "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
                ],
                stock: 14,
                onSale: false,
                slug: "lion",
                categoryName: "cats"
            },            
            {
                image: "gorilla",
                title: "Black Haired Gorilla with Broad Chest and Shoulder. Would be an Excellent Spot at the Gym",
                price: "47,775",
                description: [
                    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
                    "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
                    "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
                    "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
                ],
                stock: 14,
                onSale: false,
                slug: "gorilla",
                categoryName: "mammals"
            }            
        ]
    })
}

AnimalsData()
.catch(e => {throw e})
.finally(async () => {await prisma.$disconnect()})

如果它有任何幫助,我將使用 prisma 2.24、apollo 和 graphql 和 postgres 數據庫。 非常感謝任何幫助或建議。

如果Category表中沒有具有相同categoryName的匹配記錄,Prisma 將不允許您使用Animals.categoryName中提供的某個外鍵創建Animal記錄。 這稱為外鍵約束。

要滿足外鍵約束,您需要確保Category表中已經存在與您嘗試在Animals表中創建的記錄具有相同categoryName的記錄。 對於您提到的示例,這意味着在Category.categoryName的“mammals”和“cats”的Category表中創建兩條記錄。

在運行animals.createMany查詢之前,您可以執行以下操作,

await prisma.category.createMany({
        data: [
            {
                categoryName: "mammals",
                image: "__PLACEHOLDER_VALUE__"  // change appropriately
            },
            {
                categoryName: "cats",
                image: "__PLACEHOLDER_VALUE__"  // change appropriately
            }
        ]
    })

//  ...run await prisma.animals.createMany 

無法使用單個createMany查詢同時創建AnimalCategory ,因為您無法訪問 CreateMany 查詢中的關系 如果這是您想要做的事情,請考慮使用create而不是createMany 您可以在 Prisma 文檔的嵌套寫入部分中找到有關此的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM