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
310
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
sqlx の実装を読んでみた話
Sugar Sato
September 04, 2024
More Decks by Sugar Sato
See All by Sugar Sato
AIと共に生きる技術選定 2026
sgash708
0
280
Bref でサービスを運用している話
sgash708
0
330
tool ディレクティブを導入してみた感想
sgash708
1
300
DeepWiki で Go をもっと好きになろう
sgash708
0
1.1k
環境変数ライブラリ選手権
sgash708
0
310
はじめての Go * WASM * OCR
sgash708
1
440
もう僕は OpenAPI を書きたくない
sgash708
6
2.7k
【懺悔】1年目 EM の失敗から学ぼう
sgash708
0
250
testcontainers のススメ
sgash708
1
540
Featured
See All Featured
Fireside Chat
paigeccino
42
4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
640
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
320
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
370
KATA
mclloyd
PRO
35
15k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
390
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
970
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
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 引用