一个典型的 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
开销。