Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ちょこっとdive gorm.DB.Updates()
Search
aroon
December 15, 2024
0
130
ちょこっとdive gorm.DB.Updates()
第56回kyoto.goのLT枠で発表した際の資料。
ちょこっとgormの中を探検する感じの発表でした。
aroon
December 15, 2024
Tweet
Share
More Decks by aroon
See All by aroon
goにおける コネクションプールの仕組み を軽く掘って見た
aronokuyama
0
60
Featured
See All Featured
Being A Developer After 40
akosma
90
590k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.2k
Into the Great Unknown - MozCon
thekraken
40
2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1k
Making the Leap to Tech Lead
cromwellryan
134
9.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
740
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
1k
Automating Front-end Workflow
addyosmani
1370
200k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.9k
Transcript
ちょこっとdive gorm.DB.Updates() aroon
予防線(???) • 実はこんなバグがあって・・・・! • 実はこんな挙動があって・・・・! ではないです。 多分見つけてたらタイトルが もうちょい違います😇😇😇
自己紹介 • aroon • Gopher暦 半年くらい
クイズです!!
下記3つの選択肢のうち、ageがnullに更新される書き方はど れでしょうか?
正解は・・・・ 2と3です!
gormのUpdatesメソッド with null 仕様 nullableカラムに対してnullで更新しようとする場合・・・ • structを渡した場合、基本nullや0は無視される • mapであれば更新対象にしてくれる • structを利用する場合、Selectで指定すれば更新対象
にしてくれる
さらにクイズです!!
gormはどのようにして そんな仕様を実現してるんで しょうか?
Thinking Time
僕なりの回答は・・・・(というか今日の内容は) • reflectパッケージの各種メソッドの叡智を 用いて • ユーザー入力の値を丹念に場合わけし • その結果をベースにクエリを構築している
ちょっとコードを読んで 「どこでそんな処理してんの?」 を見にいきます!
Let’s GO !!
というわけでまずはUpdatesにGo !! 罠である
こんな感じ processor構造体のポインタを返している だけである。
Executeについても・・・・
読み進めていくと・・・ p.fnsからメソッド取り出して適用してる・・・!?
どのタイミングでp.fns構造体に詰めたんだ・・・?
そう。Openメソッドです。 というわけで Openを読み進めていくと、 コールバックを登録するよ!みたいなメソッドにたどり着く。
Updateメソッドがいるぞ・・・!
上から読み進めると・・・ • ConvertToAssignmentsにてついにお目当てのコードに辿り着く・・・! • ここからはリアルコードに行きます・・・! ◦ https://github.com/go-gorm/gorm/blob/v1.25.12/callbacks/update.go#L260
まとめ • gormはOpenメソッドで ◦ 各種構造体を初期化している ◦ Update, Queryなどの関数を登録している • Updateメソッド内部の
◦ ConvertToAssignmentsメソッドにて ▪ mapか構造体かでsetするかどうかを決定している ▪ structの際は、Nilや0の場合にsetしない ◦ と判定している