$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ちょこっとdive gorm.DB.Updates()
Search
aroon
December 15, 2024
0
150
ちょこっと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
160
Featured
See All Featured
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
33
sira's awesome portfolio website redesign presentation
elsirapls
0
89
A better future with KSS
kneath
240
18k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
130
How to build a perfect <img>
jonoalderson
0
4.6k
Navigating Team Friction
lara
191
16k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
68
The SEO Collaboration Effect
kristinabergwall1
0
300
Evolving SEO for Evolving Search Engines
ryanjones
0
73
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
100
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
120
The untapped power of vector embeddings
frankvandijk
1
1.5k
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しない ◦ と判定している