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
100
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
51k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
BBQ
matthewcrist
89
9.8k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Writing Fast Ruby
sferik
629
62k
Unsuck your backbone
ammeep
671
58k
Visualization
eitanlees
148
16k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
Music & Morning Musume
bryan
46
6.8k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
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しない ◦ と判定している