添加新字段后,Prisma Schema 未正确更新

Posted

技术标签:

【中文标题】添加新字段后,Prisma Schema 未正确更新【英文标题】:Prisma Schema not updating properly after adding new fields 【发布时间】:2021-04-16 04:26:37 【问题描述】:

正如标题所述,我在 Next JS 应用程序中使用 Prisma 2。我有一个非常简单的架构:

  model User 
  id             Int       @id @default(autoincrement())
  firstName      String
  middleName     String?
  firstLastname  String
  secondLastname String?
  email          String
  role           String
  group          Group?    @relation(fields: [groupId], references: [id])
  groupId        Int?
  activity       Activity? @relation(fields: [activityId], references: [id])
  activityId     Int?
  createdOn      DateTime  @default(now())
  updatedOn      DateTime  @default(now())


model JobTitle 
  id        Int      @id @default(autoincrement())
  name      String
  createdOn DateTime @default(now())
  updatedOn DateTime @default(now())


model Group 
  id        Int      @id @default(autoincrement())
  name      String
  users     User[]
  createdOn DateTime @default(now())
  updatedOn DateTime @default(now())


model Activity 
  id    Int    @id @default(autoincrement())
  name  String
  users User[]

我在 User 模型上添加了 email 字段,并将 groupIdactivityId 字段更改为可选。我还将role 字段的类型更改为String。我运行prisma migrateprisma up 来创建一个新的迁移并同步数据库(使用远程heroku postgresql 数据库作为我的数据源)并且一切运行正常。没有错误。但是,当我尝试创建新用户时,出现以下错误:

An error ocurred:  PrismaClientValidationError:
Invalid `prisma.user.create()` invocation:


  data: 
    firstName: 'John',
    middleName: 'Edgar',
    firstLastname: 'Doe',
    secondLastname: 'Smith',
    email: 'john@email.com',
    ~~~~~
    role: 'ADMIN',
          ~~~~~~~
+   group: 
+     create?: GroupCreateWithoutUsersInput,
+     connect?: GroupWhereUniqueInput,
+     connectOrCreate?: GroupCreateOrConnectWithoutusersInput
+   ,
+   activity: 
+     create?: ActivityCreateWithoutUsersInput,
+     connect?: ActivityWhereUniqueInput,
+     connectOrCreate?: ActivityCreateOrConnectWithoutusersInput
+   ,
?   createdOn?: DateTime,
?   updatedOn?: DateTime
  


Unknown arg `email` in data.email for type UserCreateInput. Did you mean `role`?
Argument role: Got invalid value 'ADMIN' on prisma.createOneUser. Provided String, expected RoleCreateOneWithoutUserInput:
type RoleCreateOneWithoutUserInput 
  create?: RoleCreateWithoutUserInput
  connect?: RoleWhereUniqueInput
  connectOrCreate?: RoleCreateOrConnectWithoutUserInput

Argument group for data.group is missing.
Argument activity for data.activity is missing.

Note: Lines with + are required, lines with ? are optional.

    at Document.validate (C:\Users\user\Documents\projects\employee-evaluation-app\employee-evaluation-app\node_modules\@prisma\client\runtime\index.js:77411:19)
    at NewPrismaClient._executeRequest (C:\Users\user\Documents\projects\employee-evaluation-app\employee-evaluation-app\node_modules\@prisma\client\runtime\index.js:79063:17)
    at C:\Users\user\Documents\projects\employee-evaluation-app\employee-evaluation-app\node_modules\@prisma\client\runtime\index.js:79000:52
    at AsyncResource.runInAsyncScope (node:async_hooks:197:9)
    at NewPrismaClient._request (C:\Users\user\Documents\projects\employee-evaluation-app\employee-evaluation-app\node_modules\@prisma\client\runtime\index.js:79000:25)
    at Object.then (C:\Users\user\Documents\projects\employee-evaluation-app\employee-evaluation-app\node_modules\@prisma\client\runtime\index.js:79117:39)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:93:5) 
  clientVersion: '2.12.0'

似乎该操作使用的是以前版本的架构,因为它表示电子邮件字段不存在并且role 字段不是字符串类型。此外,groupIdactivityId 字段仍按要求显示。我不知道是否有某种缓存。我已经尝试删除所有迁移并从头开始重新部署所有内容。我什至删除了 heroku 中的数据库并重新开始,但我仍然遇到同样的错误。

【问题讨论】:

我建议在您的package.json 中添加prisma generate 作为postinstall 脚本,以便始终生成最新的PrismaClient。用户here 也遇到了同样的问题,这个脚本解决了它。 好的。我会仔细看看的。我看到解决方案的那部分也更新到了 2.14 版。但是,我不得不回滚到 2.12,因为正在进行的 issue 在 Heroku 中使用基于云的数据库时无法创建影子数据库,这正是我的情况。 好的,所以我尝试运行prisma generate,它当然在重新启动本地服务器后工作。似乎我只需要更仔细地阅读documentation。每次更改架构时都需要运行此命令。非常感谢您的帮助! 【参考方案1】:

运行 npm install(无需删除 node_modules)然后重新生成 Prisma 类型可以解决此问题。

由于npm i 删除了旧的 Prisma 代,npx prisma generate 将不得不从您的 schema.prisma 生成新的。

Ryan 关于为 Prisma 添加安装后脚本的评论也是一个不错的 QOL 改进。

编辑: 关闭和打开你的编辑器(在我的例子中是 VsCode)将修复红线错误。我认为扩展很难用新的变化来更新自己。这很痛苦,但如果其他解决方案没有,它确实有效。

【讨论】:

即使删除 node_modules 似乎也无济于事:/ 添加了一个可能有帮助的编辑。这不是一个有趣的解决方案,但在扩展被修补之前它可以工作 我认为这个错误最终对我来说似乎无关紧要,比如在其中使用 connectOrCreate 错误,我想可能会在它没想到的地方将 undefined 传递给它它。所以可能只是一个非常糟糕的错误消息。

以上是关于添加新字段后,Prisma Schema 未正确更新的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法从 datamodel.prisma 文件生成 schema.graphql 文件?

prisma - 运行 graphql 查询时获取环境变量未找到错误消息

Prisma:字段...未在...输入类型或类型中定义...预期但未提交对象

向架构添加新字段后如何更新旧文档?

节点 express-graphql 应用程序中使用的 Prisma 2 DateTime 字段

正确声明 GraphQL Yoga 提供的 Prisma 字段但在解析器中不需要的方法