在 TypeORM 更新字段時(shí),是否每次都會(huì)執(zhí)行 update SQL 呢?

一個(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)銷。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,286評(píng)論 8 265
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • 我本應(yīng)該去流浪 路過(guò)荒野,順著風(fēng)向 提著一壺老酒 塵土飛揚(yáng) 我本應(yīng)該去流浪 跨過(guò)河流,順著風(fēng)向 唱著一首老歌 水波...
    北國(guó)荒草閱讀 520評(píng)論 9 8

友情鏈接更多精彩內(nèi)容