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

22

如标题所述,我在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[]
}

我在用户模型上添加了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'
}

看起来操作正在使用先前版本的架构,因为它显示电子邮件字段不存在,而角色字段不是字符串类型。此外,groupIdactivityId仍然被显示为必需的。我不知道是否存在某种缓存。我已经尝试删除所有迁移并从头重新部署所有内容。我甚至在 Heroku 中删除了数据库并重新开始,但仍然收到相同的错误。


7
我建议在你的 package.json 文件中将 prisma generate 添加为 postinstall 脚本,这样最新的 PrismaClient 就会被自动生成。一个用户 在这里 遇到了同样的问题,而这个脚本解决了它。 - Ryan
好的,我会研究一下。我看到解决方案的那部分也更新到了2.14版本。然而,由于一个持续存在的问题(https://github.com/prisma/prisma/issues/4751),我不得不回滚到2.12版本,因为在Heroku中使用基于云的数据库时无法创建影子数据库,这恰好是我的情况。 - Isaac
2
好的,我尝试运行 prisma generate 命令,在重新启动本地服务器后它成功了。看来我只是需要更仔细地阅读文档。每次对模式进行更改时都需要运行此命令。非常感谢您的帮助! - Isaac
10个回答

30
在运行 npx prisma migrate devnpx prisma db push 后,在 VS Code 中解决此问题,您可以尝试以下方法之一:
  • 重新加载 VS Code(只需简单地关闭并重新打开 VS Code)
  • 重启 VS Code 语言服务器(按下 Ctrl + Shift + P,然后搜索 Restart TS server
以上两种方法将需要几分钟才能使 VS Code 再次正常工作,因此我推荐这种方式:
  • 打开文件node_modules\.prisma\client\index.d.ts以使 VS Code 重新索引该文件(由于文件太大,VS Code 不会重新加载该文件),然后它将在几秒钟内工作。

重启 Ts 服务器对我有用。谢谢。 - i_am_daim
1
我在VSCode中找不到“重新启动VS Code语言服务器”的选项。 - Michael Dausmann
@MichaelDausmann,你尝试过这些方法吗?Windows和Linux:
  1. 打开命令面板。Ctrl + Shift + P。
  2. 然后输入:Reload Window。
MacOS:
  1. 在macOS上使用 Command + Shift + P。
  2. 然后输入:Reload Window。
- Gustavo Ribeiro
我不明白为什么这个方法有效,但它确实有效(看起来像是返回了一个数据库错误,而不是一个 TypeScript 错误...) - undefined

17

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

npm i会删除旧的Prisma生成文件,所以npx prisma generate将从您的schema.prisma生成新的Prisma类型。

Ryan关于为Prisma添加post install脚本的评论也是不错的QOL改进。

编辑:关闭并重新打开你的编辑器(在我这里是VsCode)将修复红色线条错误。我认为扩展程序难以更新自己与新更改的同步。如果其他解决方案不起作用,那么这样做虽然繁琐但仍可行。


1
即使删除了node_modules文件夹,似乎也无法帮助我 :/ - Powersource
已添加了一个编辑,可能会有所帮助。这不是一个有趣的解决方案,但在扩展被修补之前它可以起作用。 - James
我认为最终对我造成问题的错误似乎与其他事情无关,可能是在使用connectOrCreate时出现了问题,可能是在一个不该传递未定义值的地方传递了未定义值。因此,这可能只是一个非常糟糕的错误消息。 - Powersource
删除 node_modules 文件夹,然后运行 npm install 命令,接着运行 npx prisma generate 命令可以解决我的问题。 - Cathal Mac Donnacha

4

在运行 npx prisma db push 后,您必须重新启动 VS Code 才能看到更改。


1
删除根目录下的.next文件夹,并重新启动开发服务器。

1

我遇到了类似的问题。在我的情况下,我更新了Schema.prisma文件中的新模型,但每次运行“prisma migrate dev”时,它都不会更新。后来发现错误是因为在运行代码之前没有点击“保存”按钮保存更改。(为自己辩护一下,我以为自动保存已经处理了这个问题,但事实并非如此)。

在运行“prisma migrate dev”之前,请再次保存文件。


0

重启 VS Code 对我来说起作用了XD


1
这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - Wahlstrommm
@Wahlstrommm 重新加载VSCode确实可以解决问题,正如楼主所回答的那样。 - stuckoverflow

0
在我的情况下,问题出现的原因是我从另一个文件中复制了路径的框架,并没有更改我需要访问的表的名称,这就是为什么它会发送给我这个错误。
router.post('/routes', async (req, res) => {
  const newData = await prisma.nameTable.create({
    data: req.body,
  });
  res.json(newData);
});

-1
我的模拟测试失败了。请检查一下.env.test和.env文件是否一致,并且确认你已经在它们上运行了迁移操作。

-1
遇到了与Prisma拒绝为相关表更新新名称的相同问题。尝试了所有的重置、重新启动和删除.next等操作,但都没有起作用。
最后我不得不:
1. 删除我的数据库,幸运的是它只是一个Docker容器。 2. 使用空数据库启动一个新的Docker容器 - docker compose up。 3. 删除Prisma的迁移文件夹。 4. 为Prisma运行一个全新的迁移 - npx prisma migrate dev。 5. 使用我的种子数据填充数据库 - npx prisma db seed。
现在一切都恢复正常了。

-1

你可以在 migrations.sql 文件中进行更新,然后运行 prisma migrate dev 命令。这样就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接