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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Sugar Sato
September 04, 2024
280
1
Share
sqlx の実装を読んでみた話
Sugar Sato
September 04, 2024
More Decks by Sugar Sato
See All by Sugar Sato
AIと共に生きる技術選定 2026
sgash708
0
69
Bref でサービスを運用している話
sgash708
0
230
tool ディレクティブを導入してみた感想
sgash708
1
260
DeepWiki で Go をもっと好きになろう
sgash708
0
1k
環境変数ライブラリ選手権
sgash708
0
260
はじめての Go * WASM * OCR
sgash708
1
400
もう僕は OpenAPI を書きたくない
sgash708
6
2.6k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
230
testcontainers のススメ
sgash708
1
500
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.8k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
190
Typedesign – Prime Four
hannesfritz
42
3k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
360
Test your architecture with Archunit
thirion
1
2.2k
GitHub's CSS Performance
jonrohan
1032
470k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
260
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
180
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
120
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
520
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 引用