Sequelize .update() 不使用正确的位置并更新所有行

Posted

技术标签:

【中文标题】Sequelize .update() 不使用正确的位置并更新所有行【英文标题】:Sequelize .update() not using the correct where and updates all rows 【发布时间】:2022-01-21 12:53:11 【问题描述】:

我正在尝试创建批准命令。 关于它的一切都应该正常工作,但它永远无法正常工作。 我已将我的数据库更改为首先具有“id”,但它仍然更喜欢更新“user”。

我试过让我的代码只是;但这从未成功。即使我在其他任何地方都使用它。

await ticketApproval.update(status: 1);

我查看了文档和其他 *** 问题和答案。 目前还没有任何效果,但据我所知,我的代码中没有任何内容应该告诉它更新 "user" id。因为我只告诉它搜索票 "id""server" id 感觉就像完全忽略了 Where。

代码

控制台

测试样本

【问题讨论】:

请不要将代码片段作为图片发布。很难在答案中使用或修改它们 【参考方案1】:

您显然将记录实例的update 方法与模型的静态update 混淆了。 只有静态update 具有where 选项,因为它使用传递的条件更新数据库中的多个记录,而实例update 方法使用某个记录的主键值来使用传递的值更新它。 比较:

// here we have a model instance for a concrete record
const ticketApproval = await Ticket.findOne(
  where: 
     id: ticketToApprove
  
)
// by calling the instance `update` we always update this concrete record only
// using a primary key value condition, see a primary key field defined in a model
await ticketApproval.update( status: 1 );

// by calling the static `update` we update all records that satisfy the indicated conditions
await Ticket.update( status: 1 , 
  where: 
     id: ticketToApprove
  
);

【讨论】:

我不太确定,但我试过await ticketApproval.update( status: 1 ); 这实际上是我使用的第一件事,因为这是我之前处理所有事情的方式,但仍在更新用户 ID,而不是工单 ID。我什至删除了服务器 ID,但仍然有同样的问题。我也使用它,因为我想确保人们不会在该服务器之外批准票证。我想我也可以为此做一个 if 语句。 ticketApprovalconcrete 记录的一个实例,因此其 update 方法将始终使用主键字段及其在 WHERE 条件下的值更新此唯一记录 如果你想更新where选项中指示条件的几条记录,只需更新静态Ticket.update方法 这就是问题所在,不管我是否使用ticketApproval.update( status: 1 ); 它仍然会更新用户。我找不到导致它在用户上更新的原因,因为它似乎忽略了“where”的选项 好吧,我想我会使用 Ticket.update 上的 Where 来代替,因为这确实对我有用

以上是关于Sequelize .update() 不使用正确的位置并更新所有行的主要内容,如果未能解决你的问题,请参考以下文章

Sequelize:按列更新它的旧值

Sequelize:无法连接到 SQL Server - 传递的端口不正确

如何在 NestJs 框架中使用 postgres 和 sequelize 正确定义 DTO 对象

使用 sequelize 可以进行 TRANSACTION 吗?

正确删除并使用 sequelize 创建 ENUM?

如何使用 TypeScript 正确键入 Sequelize JOIN?