Hướng dẫn prisma mongodb enum - lăng kính mongodb enum

Cái này đang hoạt động! Tôi nghĩ rằng nó được bí mật giấu trong ____10, nhưng nếu không, bạn có thể truy cập nó bằng cách sử dụng

  const user = await prisma.user.create({
    data: {
      id: 3,
      firstName: "Bob",
      lastName: "Alice",
      status: "Active",
    },
  })
  console.dir(user, { depth: Infinity })
1 hoặc đợi cho đến
  const user = await prisma.user.create({
    data: {
      id: 3,
      firstName: "Bob",
      lastName: "Alice",
      status: "Active",
    },
  })
  console.dir(user, { depth: Infinity })
2.

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

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

generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["mongodb"]
}

model User {
  id        Int    @id @map("_id")
  firstName String
  lastName  String
  status    Status @default(Active)
}

enum Status {
  Active
  Inactive
}

  const user = await prisma.user.create({
    data: {
      id: 3,
      firstName: "Bob",
      lastName: "Alice",
      status: "Active",
    },
  })
  console.dir(user, { depth: Infinity })

{
  id: 3,
  firstName: 'Bob',
  lastName: 'Alice',
  status: 'Active'
}

Vì vậy, tôi đã thực hiện lược đồ này trong trường hợp đầu tiên

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

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

model User {

  id        String      @id @default(auto()) @map("_id") @db.ObjectId
  email     String      @unique
  role      TipoFichaje @default(JORNADA_ENTRADA)
  createdAt DateTime    @db.Date

}

model Entity {

  id        String   @id @default(auto()) @map("_id") @db.ObjectId
  name      String
  createdAt DateTime @db.Date

}

enum TipoFichaje {
  JORNADA_ENTRADA
  JORNADA_SALIDA
  DESAYUNO
  COMIDA
  FORMACION
  FORMACION3
}

Vậy thì tôi đã đẩy DB (PRISMA DB Push--preview-Feature) và sau đó tôi đã chèn một đối tượng như thế này:

{
  email: ""
  role:"FORMACION3"
  createdAt:1970-01-01T00:00:00.000+00:00
}

Sau đó, tôi loại bỏ enum "Formacion3" khỏi Tipofichaje và đẩy lại (PRISMA DB PUSH)

Như thế này:

enum TipoFichaje {
      JORNADA_ENTRADA
      JORNADA_SALIDA
      DESAYUNO
      COMIDA
      FORMACION
}

Khi tôi cố gắng lấy dữ liệu với Prisma Studio ném lỗi này:

Message: Error in Prisma Client request: 


Invalid `prisma.user.findMany()` invocation:


  Value 'FORMACION3' not found in enum 'TipoFichaje'
  
Query:
{
  "modelName": "User",
  "operation": "findMany",
  "args": {
    "take": 100,
    "skip": 0,
    "select": {
      "id": true,
      "email": true,
      "role": true,
      "createdAt": true
    }
  }
}

Câu hỏi của tôi là: Đó có phải là một hành vi bình thường? Ý tôi là nếu tôi di chuyển DB với những thay đổi mới không nên di chuyển sửa lỗi này? Làm thế nào tôi có thể sửa lỗi này?

Vấn đề

Các enum hiện ngăn chặn các giá trị nhất định được sử dụng, yêu cầu sử dụng

  const user = await prisma.user.create({
    data: {
      id: 3,
      firstName: "Bob",
      lastName: "Alice",
      status: "Active",
    },
  })
  console.dir(user, { depth: Infinity })
3 để phản ánh chính xác những gì thực sự được lưu trữ trong cơ sở dữ liệu.

Điều này gây ra một vài vấn đề:

  1. Không có cơ chế do PRISMA cung cấp để truy cập giá trị cơ bản, như sẽ cần thiết nếu / khi giá trị được ánh xạ cần được truy cập / trả về / hiển thị cho người dùng.
  2. Có vẻ như không cần thiết, nhìn vào mã được tạo cho máy khách JavaScript/TypeScript.

ví dụ: những điều sau đây hiện không được phép:

enum Place {
  1st
  2nd
  3rd
}

enum AddressUnitType {
  "Apt."
  Suite
  Unit
}

Lưu ý: Các định danh Enum có không gian nhúng cũng không được phép.

Thay vào đó, họ yêu cầu sử dụng

  const user = await prisma.user.create({
    data: {
      id: 3,
      firstName: "Bob",
      lastName: "Alice",
      status: "Active",
    },
  })
  console.dir(user, { depth: Infinity })
4 như thế này:

enum Place {
  first @map("1st")
  second @map("2nd")
  third @map("3rd")
}

enum AddressUnitType {
  Apt @map("Apt.")
  Suite
  Unit
}

Ngoài ra, vì PRISMA hiện không cung cấp một cơ chế được hỗ trợ để dịch giữa các giá trị enum được ánh xạ và định danh enum, đây là một lớp dịch khác phải được cung cấp.

Giải pháp đề xuất

Cho phép các enum prisma được xác định bằng cách sử dụng các tài liệu kép kèm theo nếu cần

eg:

enum Place {
  "1st"
  "2nd"
  "3rd"
}

enum AddressUnitType {
  "Apt."
  Suite
  Unit
}

Điều này sẽ tránh được sự cần thiết phải sử dụng bất kỳ bản dịch nào khác của định danh cho giá trị.

Tôi tưởng tượng rằng các kiến ​​trúc sư Prisma đang bị hạn chế ở đây và muốn lấy 'mẫu số chung thấp nhất', do đó, nếu họ muốn thêm các trình tạo cho các ngôn ngữ khác, đặc biệt có những hạn chế tương tự như những gì Prisma hiện đang áp đặt.

Có lẽ trong trường hợp đó, khi dự án được biết là chỉ cần tạo máy khách JavaScript/TypeScript, cần có một tùy chọn cấu hình có thể được đặt để chỉ ra việc thư giãn các hạn chế giá trị Enum, do những hạn chế đó sẽ không bao giờ gặp phải.

Lựa chọn thay thế

Bối cảnh bổ sung