【问题标题】:Prisma2 prisma introspect returning weird values for foreign keysPrisma2 prisma introspect 返回奇怪的外键值
【发布时间】:2020-08-08 00:04:51
【问题描述】:

我有两张桌子,UserRelationship。这些表用于存储父子关系。我正在使用Postgres

// schema.sql

CREATE TABLE "public"."Relationships" (
    id SERIAL PRIMARY KEY NOT NULL,
    parent_id INT NOT NULL,
    FOREIGN KEY (parent_id) REFERENCES "User" (id),
    child_id INT NOT NULL,
    FOREIGN KEY (child_id) REFERENCES "User" (id)
)

CREATE TABLE "public"."User" (
    id SERIAL PRIMARY KEY NOT NULL,
    name VARCHAR(128) NOT NULL,
    email VARCHAR(128) UNIQUE,
    password VARCHAR(128) NOT NULL,
    isChild BOOLEAN NOT NULL DEFAULT false
    created_at TIMESTAMP NOT NULL DEFAULT NOW();
);  

当我运行npx prisma introspect 时,schema.prisma 文件中会返回以下内容。

// schema.prisma

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

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

model Relationships {
  child_id                           Int
  id                                 Int  @default(autoincrement()) @id
  parent_id                          Int
  User_Relationships_child_idToUser  User @relation("Relationships_child_idToUser", fields: [child_id], references: [id])
  User_Relationships_parent_idToUser User @relation("Relationships_parent_idToUser", fields: [parent_id], references: [id])
}

model User {
  created_at                                  DateTime        @default(now())
  email                                       String?         @unique
  id                                          Int             @default(autoincrement()) @id
  ischild                                     Boolean         @default(false)
  name                                        String?
  password                                    String
  Relationships_Relationships_child_idToUser  Relationships[] @relation("Relationships_child_idToUser")
  Relationships_Relationships_parent_idToUser Relationships[] @relation("Relationships_parent_idToUser")
}

我不明白 User_Relationships_child_idToUserUser_Relationships_parent_idToUser 是什么以及为什么它们不仅仅是 Prisma 文档教程中出现的外键的简单语法。

【问题讨论】:

    标签: postgresql prisma prisma-graphql


    【解决方案1】:

    Prisma 的自省为每个外键生成两个字段:

    • 关系标量字段(基本上是外键的直接表示)
    • 一个关系字段(带有@relation 属性注释)——这些字段似乎让您感到困惑。它们提供的原因是您可以在 Prisma Client API 中轻松处理关系。

    您可以在文档here 中找到更多相关信息。

    当然User_Relationships_parent_idToUserUser_Relationships_child_idToUser 不是很好的名字。您可以在自省和rename the relation fields 之后手动调整架构以获得更友好的名称,例如:

    model Relationships {
      child_id  Int
      id        Int  @default(autoincrement()) @id
      parent_id Int
      child     User @relation("Relationships_child_idToUser", fields: [child_id], references: [id])
      parent    User @relation("Relationships_parent_idToUser", fields: [parent_id], references: [id])
    }
    

    【讨论】:

    • 为什么示例代码显示的更简单?
    • 您具体指的是哪个示例代码?我想这里的一个很大区别是,在您的示例中,UserRelationship 之间有 两个 关系(因为您定义了两个外键),而大多数示例代码 sn-ps 只使用一个外键。
    • 我指的是 prisma.io 从头开始​​教程。不过你的建议很有意义。
    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2021-09-12
    • 2013-04-26
    • 2013-02-07
    相关资源
    最近更新 更多