一個(gè)典型的 TypeORM 更新字段的操作:
const user = await User.findOne({ name: 'Jack Ma' });
user.name = 'Jack Ma';
await user.save();
此時(shí) TypeORM 會(huì)執(zhí)行 update 語(yǔ)句嗎?
不會(huì)
那么 TypeORM 是如何得知字段沒(méi)有改動(dòng)的呢
有兩種猜測(cè):
1 setter 時(shí)檢測(cè)
即執(zhí)行這段代碼時(shí):
user.name = 'Jack Ma';
根據(jù)實(shí)例上的 setter 檢測(cè)值是否發(fā)生變化,在后面 save 時(shí)根據(jù)這里記錄的變化決定是否執(zhí)行 update。
不過(guò)這種方式有個(gè)缺陷,即這條數(shù)據(jù)庫(kù)記錄在此期間被改變了值,此時(shí) setter 的檢測(cè)可能不準(zhǔn)。
2 update 前多執(zhí)行一次 select
每次準(zhǔn)備執(zhí)行 update 前,再 select 一次對(duì)比是否字段發(fā)生了變化,這種方式雖然穩(wěn)妥但是浪費(fèi)時(shí)間,在用戶確信他的場(chǎng)景下不需要一次額外的 select 時(shí)會(huì)比較多余。
做了實(shí)驗(yàn)發(fā)現(xiàn) TypeORM 使用的是上述方法 2。所以大家如果確信你的場(chǎng)景不需要額外的 select 時(shí),可以在設(shè)置 ORM 實(shí)例的字段之前自己手動(dòng)檢測(cè)一次字段改變,如果沒(méi)變就不需要設(shè)置了,避免額外的 select 開(kāi)銷。