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
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Nul...
Search
mackee
May 17, 2024
Programming
0
170
database/sqlでNullを扱う歴史とsql.Null[T]の登場 / sql.Null[T] history
kamakura.go #6
https://kamakurago.connpass.com/event/316438/
mackee
May 17, 2024
Tweet
Share
More Decks by mackee
See All by mackee
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
55
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
310
perl for shell, awk and sed programmers
mackee
2
1.8k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
240
マイクロサービス化を利用した Goへの移行事例
mackee
0
300
PerlでつくるフルスクラッチWebAuthn/パスキー認証 / Demonstration of full-scratch WebAuthn/Passkey Authentication written in Perl
mackee
3
3.7k
SRE定例やその辺の取り組みをアプリケーションエンジニア目線で語る / "Observe" about SRE Meeting by Application Engineer
mackee
0
1.8k
TinyGoで使えるORM sqllaの 紹介とTinyGoで使えるようにするための工夫
mackee
0
1.3k
Go向けORM sqllaの紹介と JOINやUNIONを含んだクエリの扱い方
mackee
0
4.8k
Other Decks in Programming
See All in Programming
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
780
iOSエンジニアから始める visionOS アプリ開発
nao_randd
3
130
pylint custom ruleで始めるレビュー自動化
shogoujiie
0
120
楽しく向き合う例外対応
okutsu
0
110
時計仕掛けのCompose
mkeeda
1
300
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
580
CDK開発におけるコーディング規約の運用
yamanashi_ren01
2
120
Lottieアニメーションをカスタマイズしてみた
tahia910
0
130
プログラミング言語学習のススメ / why-do-i-learn-programming-language
yashi8484
0
130
Immutable ActiveRecord
megane42
0
140
技術を根付かせる / How to make technology take root
kubode
1
250
Bedrock Agentsレスポンス解析によるAgentのOps
licux
3
840
Featured
See All Featured
For a Future-Friendly Web
brad_frost
176
9.5k
Navigating Team Friction
lara
183
15k
What's in a price? How to price your products and services
michaelherold
244
12k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
4
330
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Why Our Code Smells
bkeepers
PRO
336
57k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Designing for humans not robots
tammielis
250
25k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Transcript
database/sqlͰNULLΛѻ͏ ྺ࢙ͱsql.Null[T]ͷొ kamakura.go #6 @mackee_w a.k.a macopy 2024-05-17
Δਓ • X: @mackee_w • GitHub: @mackee • ໘ന๏ਓΧϠοΫ •
Tonamel αʔόʔαΠυΤϯδχΞ
database/sqlͰNULLΛѻ͏ ͱʁ
database/sqlͰNULLΛѻ͏
database/sqlͰNULLΛѻ͏ • sql.Null**ͱ͍͏ܕͰϥοϓͯ͠ग़͠ೖΕΛ͢Δ • ϙΠϯλܕͰͳ͍(͕ɺϙΠϯλܕͷnilΛαϙʔτ͍ͯ͠Δέʔε͋Δ) • sql.Null**Validͱ͍͏ϑΟʔϧυ͕͋Δ • Valid͕falseͩͱNull, trueͩͱNullͰͳ͍
• ValidͱผʹΛ֨ೲ͢ΔϑΟʔϧυ͕͋Δ • sql.NullStringͰ͋Ε `String string`, sql.NullInt64Ͱ͋Ε`Int64 int64`
ͦͦdatabase/sqlͰѻ͏ͬͯͳΜͩʁ • جຊతʹҎԼͷinterface͕࣮͞Ε͍ͯΔܕ • SQLͷͱͯ͠͏߹ database/sql/driver.Valuer • ΫΤϦͷ݁Ռ͔Βड͚औͬͨͷΛGoͷมʹόΠϯυ͢Δ߹ɺ database/sql.Scanner •
GoͷϓϦϛςΟϒܕdriverྀ͕͍ͯ͠Δܕͦͷ··ಥͬࠐΊΔ • ޙऀͷྫ: json.RawMessage(go-sql-driver/mysql)
driver.ValuerͰNULLΛSQLʹೖΕΔʹ • driver.Valuer.Value()͕nilΛฦͤྑ͍ • sql.Null**ͳͲͦ͏ͳ͍ͬͯΔ • driver.Valuer.Value()͕typed-nilΛฦͨ͠߹ʁ • driver͘͠database/sql/driverͰuntyped-nilʹม͞Ε͍ͯΔ ͷͰηʔϑ
• Ͱuntyped-nilΛฦͨ͠ํ͕(͓ߦّ)ྑ͍Ͱ͢Ͷ
driver.ScanͰNULLΛड͚Δʹʁ • driver.Scanner.Scanʹuntyped-nil͕ೖͬͯ͘ΔͷͰɺͦΕͰValidͷ ఆΛߦ͏ • sql.Null**ʹnil͕ೖͬͨ߹Validʹfalse͕ೖΓɺ͕ೖΔ fi eldʹθ ϩ͕ೖΔΑ͏ʹͳ͍ͬͯΔ •
driver.ScannerͰͳ͘ϙΠϯλܕͰnullΛड͚ͨΒnil͕ೖΔ • Ͱθϩnilͱݟ͚͕͔ͭͳ͍͔ʁ ؾ͕͢Δ͚ͩͳͷͰ۩ମతͳ έʔε͕͋ͬͨΒڭ͍͑ͯͩ͘͞
database/sqlʹ͓͚Δsql.Null**ͷྺ࢙ • sql.NullStringdatabase/sqlύοέʔδ͕࡞ΒΕͨ࣌Ͱଘࡏ͢Δ(2011/09/29) • ࣌sql.NullableStringͱ͍͏໊લͰScannerInfo interface͕࣮͞Ε͍ͯͨ • sql.NullInt64, sql.NullFloat64, sql.BoolՃ(2012/01/26)
• ͜ͷޙgo1͕ϦϦʔε • sql.NullTimeՃ(2019/04/06), sql.NullInt32Ճ(2019/04/27), sql.NullInt16, sql.NullBytesՃ(2021/05/05)
Β͘sql.NullTime͕ͳ͔ͬͨ • ͳ͔ͬͨͷͰgo-sql-driver/mysql.NullTimeΛ͍ͬͯͨਓ͍ͨͰ ͠ΐ͏(2013/04/26͔Βଘࡏ) • ͦͷଞsql.Null**(͜͜ʹҙͷܕ͕ೖΔ)͕ཉ͍͠ํ͍ͬͺ͍͍ͨͰ ͠ΐ͏ • ϥΠϒϥϦͳΓࣗલ࣮ͳΓ͕ඞཁͰ͋ͬͨ… •
ͦΕͦΕͰϓϩδΣΫτ͝ͱʹҧ͏ͱ͍͏ࠞཚͷͱʹ…
from Go1.22 Release Notes The new Null[T] type provide a
way to scan nullable columns for any column types.
sql.Null[T]ͱ • sql.Null[T(͜͜ʹҙͷܕ͕ೖΔ)]ͷΑ͏ʹ༻͢Δ͜ͱͰɺsql.Null**ͱಉ͡ޮ ྗΛ࣋ͭܕ • sql.Null**Λ૿͞ͳͯ͘ྑ͘ͳͬͨʂ • user de fi
ned typeͱͷΈ߹Θ͕ͤྑ͍ • type HogeID uint64 ͷΑ͏ͳIDܕ࡞ͬͨ߹ʹɺͦͷNullableͳܕͱͯ͠ `sql.Null[HogeID]`͕͑Δ • methane͞ΜฒͼʹGoνʔϜͷօ͞Μ͋Γ͕ͱ͏ʂ
FAQ • Q: ࣮࣭Option/MaybeܕͰʁ • A: IssueʹͦΜͳ͕ٞ͋Γ·͕ͨ͠ɺSQLΛॻ͘ͱ͖ɺDB͔Βͷ ΫΤϦ݁ՌΛಡΉ࣌ʹͷΈ͍·͠ΐ͏Ͷ • Q:
͜Ε͕ೖͬͨܦҢʁ • A: ͱͱsql.NullUInt64ͷఏҊ͕͞Εͨ࣌ʹʮδΣωϦΫεΛͬ ͯͶʯͱ͍͏ʹͳ͍ͬͯͨ
Ҏ্ʂ