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
sqlx の実装を読んでみた話
Search
Sugar Sato
September 04, 2024
1
210
sqlx の実装を読んでみた話
Sugar Sato
September 04, 2024
Tweet
Share
More Decks by Sugar Sato
See All by Sugar Sato
DeepWiki で Go をもっと好きになろう
sgash708
0
99
環境変数ライブラリ選手権
sgash708
0
130
はじめての Go * WASM * OCR
sgash708
1
230
もう僕は OpenAPI を書きたくない
sgash708
6
2.2k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
160
testcontainers のススメ
sgash708
1
350
「僕ら」のテストに対する向き合い方
sgash708
4
440
spansql で ENUM を使いたかった話
sgash708
2
210
外部登壇のススメ
sgash708
1
16
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
524
40k
Balancing Empowerment & Direction
lara
1
350
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
53k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Embracing the Ebb and Flow
colly
86
4.7k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
670
YesSQL, Process and Tooling at Scale
rocio
173
14k
BBQ
matthewcrist
89
9.7k
Optimizing for Happiness
mojombo
379
70k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.8k
Visualization
eitanlees
146
16k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Transcript
sqlx の実装を読んでみた話 Go Connect #2 2024.09.04
自己紹介 Sugar Sato (@satoIsSugar) • 2023年 BuySell Technologies入社 • 基盤チーム所属(Portal/Account/Approval)
PjM ◦ アソシエイトマネージャー • Go / Angular / Serverless ◦ Go歴: 4年くらい • 熱帯植物 ◦ ビカクシダ • 猫 ◦ Lambda (♀ 2才)
プロダクト群「バイセルリユースプラットフォーム Cosmos」の開発が進行中 リユースに必要なすべての機能を提供する 「リユースプラットフォーム Cosmos」の開発が進行中です。 Cosmosを活用して、バイセルグループ全体での業務効率改善やデータドリブン経営の深化を目指しています。 リユースプラットフォーム Cosmos 自社開発のリユース特化業務基幹システムでありサービス群の集合体 買取申込
買取・査定 在庫管理 販売 多様なチャネルで収益最大化 CRM -顧客対応- 買取種別に応じた最適なシステム構築 Visit -訪問買取 - Store -店舗買取 - Promas -商材マスタ - Appraisal -専門査定 - Stock -在庫管理 - EXS -販売管理 - Core -会員管理- Portal -データ利用- Pocket -データ基盤- 買取 専門チームによる真贋・査定と連携 査定 申込 効率的な顧客対応 在庫 在庫管理の最適・効率化 販売 データ 各事業プロセスにある データを一元管理 :基幹システム
アジェンダ sqlx とは 01 実装を読んでみた 02 まとめ 03
sqlx とは
• > sqlx is a library which provides a set
of extensions on go's standard database/sql library ◦ database/sql に拡張機能を追加する ◦ 元のインターフェースに影響を与えない ▪ 構造体やマップ、スライスへの行マッピング ▪ 名前付きパラメータのサポート ▪ クエリから構造体への変換 sqlx
• 使い方 sqlx
実装を読んでみた
• 7ファイル (※ go.* / test / doc を除く) ◦
go.mod : 1.10 → 非推奨な記述アリ 実装ファイル
今日は時間がないので 1メソッドだけピックアップします
• ドライバが実行可能なクエリ取得 ◦ その結果に対して Exec を実行 ◦ バインディング or クエリ実行自体のエラーを返す
• バッチインサート可能 NamedExecContext
へぇ〜バッチインサートできるんだ 実装はどうなっているんだろう
NamedExecContext
NamedExecContext
• 名前付きパラメータのバインディング ◦ 名前付きパラメータを具体的なプレースホルダ(例: ? または $1) と対応する値のスライス変換 • クエリの実行
NamedExecContext
bindNamedMapper
• 型と種別チェック • 名前付きパラメータの バインディング ◦ map ◦ array /
slice ◦ struct bindNamedMapper
convertMapStringInterface • 型変換チェック • 型変換
bindMap / bindStruct / bindArray • 共通部分 ◦ compileNamedQuery ◦
bind***Args • bindArray ◦ バッチインサート部分 ◦ 引数リストを生成してい る ◦ プレースホルダーのリ バインドしている
bindMap / bindStruct / bindArray
fixBound
fixBound • バッチインサートのため に SQL クエリを適切な 形式に変換する ◦ 複数のレコードを一 度に挿入するための
VALUES 句を繰り返 し追加
findMatchingClosingBracketIndex • 最初に開いた丸括弧と閉 じ丸括弧のインデックスを 探す
compileNamedQuery
compileNamedQuery • 処理 ◦ 名前付きパラメータの解析 ◦ クエリと名前リストを返す • 問題点 ◦
マルチバイト文字を含んだ名前付きパラメータが正しく認識でき ない
compileNamedQuery • 名前付きパラメータ(:) の検出 • エスケープシーケンス 処理
compileNamedQuery • 名前付きパラメータ (:=)の検出 • 許可された文字セット の判定 ◦ [A-z0-9_.] ◦
末尾の文字じゃな いこと
compileNamedQuery • 名前のリスト追加 • bindType の形式に応 じた変換 • byte の追加
• 現在の文字(byte)が名前付きパラメータの一部でもない • 特殊なケース(エスケープシーケンスやキーバリューなど)に該当しない通 常の文字 compileNamedQuery
という感じで NamedExecContext 内でクエリ実行されます!
まとめ
まとめ • sqlx について理解が深まった • ファイル数が少ない • シンプルな記述で読みやすい • reflectの勉強にもちょうどいいかも
◦ e.g. 動的処理を自作する際の参考にするなど
sqlx 読んでみたら楽しかったぞ ということで
Thank you
• https://github.com/jmoiron/sqlx • https://pkg.go.dev/github.com/jmoiron/sqlx?utm_source=godoc 引用