为什么我的所有专栏都不显示在 prisma 客户端的类型中?

Why not all of my columns show up in prisma client's types?

我在我的 node.js 项目中使用 prisma ORM。我用 TypeScript 编码。 我已经将我的 postgresql 数据库 tables 逆向工程为 prisma 模式。然后我用 npx prisma generate 生成了 prisma 客户端。 它创建了我需要使用数据库的所有类型,但它们不正确。每个 table 都有一对类型: [tableName]CreateInput[tableName]uncheckedCreateInput (我不知道这个是干什么用的)。

例如我的 customers table 有 customersCreateInputcustomersUncheckedCreateInput 类型。 customersCreateInput 缺少 id 列(该列是最重要的一列)。 customersUncheckedCreateInput 具有包括 id 在内的所有列,但它在那里是可选的... 为什么 prisma 会这样做,我该如何解决?我想让它在每次 运行 npx prisma generate 时都能正常工作。请帮助我,我搜索了 google 几天,我找到了一些相应的主题(他们讨论了不同的问题,但它是关于 prisma 中未经检查的类型)但不明白他们在那里谈论的是什么.

export type customersCreateInput = {
    customer_email: string
    phone: string
    first_name: string
    middle_name?: string | null
    last_name?: string | null
    password_hash: string
    registered_at: Date | string
    last_login?: Date | string | null
    comments?: string | null
    addresses?: addressesCreateNestedManyWithoutCustomersInput
    carts?: cartsCreateNestedManyWithoutCustomersInput
    order_items?: order_itemsCreateNestedManyWithoutCustomersInput
    orders?: ordersCreateNestedManyWithoutCustomersInput
  }

  export type customersUncheckedCreateInput = {
    id?: number
    customer_email: string
    phone: string
    first_name: string
    middle_name?: string | null
    last_name?: string | null
    password_hash: string
    registered_at: Date | string
    last_login?: Date | string | null
    comments?: string | null
    addresses?: addressesUncheckedCreateNestedManyWithoutCustomersInput
    carts?: cartsUncheckedCreateNestedManyWithoutCustomersInput
    order_items?: order_itemsUncheckedCreateNestedManyWithoutCustomersInput
    orders?: ordersUncheckedCreateNestedManyWithoutCustomersInput
  }

我用这个 SQL 创建了那个 table qyery:

CREATE TABLE Customers (
  ID SERIAL PRIMARY KEY NOT NULL,
  Customer_Email varchar(50) UNIQUE DEFAULT null,
  Phone varchar(25) NOT NULL,
  First_Name varchar(40) NOT NULL,
  Middle_Name varchar(40) DEFAULT null,
  Last_Name varchar(40) DEFAULT null,
  Password_Hash varchar(100) NOT NULL,
  Registered_At timestamp NOT NULL,
  Last_Login timestamp DEFAULT null,
  Comments varchar(250) DEFAULT null
);

我生成的 prisma 模式如下:

model customers {
  id             Int           @id @default(autoincrement())
  customer_email String        @unique @db.VarChar(50)
  phone          String        @db.VarChar(25)
  first_name     String        @db.VarChar(40)
  middle_name    String?       @db.VarChar(40)
  last_name      String?       @db.VarChar(40)
  password_hash  String        @db.VarChar(100)
  registered_at  DateTime      @db.Timestamp(6)
  last_login     DateTime?     @db.Timestamp(6)
  comments       String?       @db.VarChar(250)
  addresses      addresses[]
  carts          carts[]
  order_items    order_items[]
  orders         orders[]
}

您有 @default(autoincrement()) 作为 id,因此您可以让 DB 完成工作而不是在这里手动传递它,它将在 DB 级别自动控制以避免冲突并为您简化事情。

但是如果你想通过id你仍然可以手动完成,这就是为什么有第二种类型的原因。

prisma 由于某种原因生成了两种不同的类型,并在它们上面使用了 ,所以你可以使用一个或另一个,但不能组合使用它们,比如:

  export type ExampleCreateArgs = {
    /**
     * Select specific fields to fetch from the Example
     * 
    **/
    select?: ExampleSelect | null
    /**
     * The data needed to create a Example.
     * 
    **/
    data: XOR<ExampleCreateInput, ExampleUncheckedCreateInput>
  }

例如,如果您想在代码中重复使用 data 类型,您可以执行以下操作:

// substitute ExampleCreateArgs to correct one from your code
type Data = ExampleCreateArgs["data"]