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
190
sqlx の実装を読んでみた話
Sugar Sato
September 04, 2024
Tweet
Share
More Decks by Sugar Sato
See All by Sugar Sato
もう僕は OpenAPI を書きたくない
sgash708
4
1.4k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
120
testcontainers のススメ
sgash708
1
220
「僕ら」のテストに対する向き合い方
sgash708
3
400
spansql で ENUM を使いたかった話
sgash708
2
160
qmuntal/stateless のススメ
sgash708
0
180
Atlas をプロジェクト導入してみた話
sgash708
0
600
チームで運用する golangci-lint の向き合い方
sgash708
3
1k
サーバーレス環境をより改善してみた話
sgash708
4
1.9k
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
240
The Invisible Side of Design
smashingmag
299
50k
Site-Speed That Sticks
csswizardry
4
380
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
100
18k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
Thoughts on Productivity
jonyablonski
69
4.5k
Become a Pro
speakerdeck
PRO
26
5.1k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
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 引用