在 TypeORM 更新字段时,是否每次都会执行 update SQL 呢?

一个典型的 TypeORM 更新字段的操作:

const user = await User.findOne({ name: 'Jack Ma' });
user.name = 'Jack Ma';
await user.save();

此时 TypeORM 会执行 update 语句吗?

不会

那么 TypeORM 是如何得知字段没有改动的呢

有两种猜测:

1 setter 时检测

即执行这段代码时:

user.name = 'Jack Ma';

根据实例上的 setter 检测值是否发生变化,在后面 save 时根据这里记录的变化决定是否执行 update

不过这种方式有个缺陷,即这条数据库记录在此期间被改变了值,此时 setter 的检测可能不准。

2 update 前多执行一次 select

每次准备执行 update 前,再 select 一次对比是否字段发生了变化,这种方式虽然稳妥但是浪费时间,在用户确信他的场景下不需要一次额外的 select 时会比较多余。


做了实验发现 TypeORM 使用的是上述方法 2。所以大家如果确信你的场景不需要额外的 select 时,可以在设置 ORM 实例的字段之前自己手动检测一次字段改变,如果没变就不需要设置了,避免额外的 select 开销。

你可能感兴趣的:(在 TypeORM 更新字段时,是否每次都会执行 update SQL 呢?)