添加新字段后,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
字段,并将 groupId
和 activityId
字段更改为可选。我还将role
字段的类型更改为String
。我运行prisma migrate
和prisma 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
字段不是字符串类型。此外,groupId
和 activityId
字段仍按要求显示。我不知道是否有某种缓存。我已经尝试删除所有迁移并从头开始重新部署所有内容。我什至删除了 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:字段...未在...输入类型或类型中定义...预期但未提交对象