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
160
ちょこっと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
190
Featured
See All Featured
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
280
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
Balancing Empowerment & Direction
lara
5
930
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
170
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
1
140
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
370
Design in an AI World
tapps
0
160
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
380
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
620
The untapped power of vector embeddings
frankvandijk
2
1.6k
Building Applications with DynamoDB
mza
96
6.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しない ◦ と判定している