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
140
sqlx の実装を読んでみた話
Sugar Sato
September 04, 2024
Tweet
Share
More Decks by Sugar Sato
See All by Sugar Sato
「僕ら」のテストに対する向き合い方
sgash708
2
180
spansql で ENUM を使いたかった話
sgash708
2
120
qmuntal/stateless のススメ
sgash708
0
130
Atlas をプロジェクト導入してみた話
sgash708
0
380
チームで運用する golangci-lint の向き合い方
sgash708
3
710
サーバーレス環境をより改善してみた話
sgash708
4
1.8k
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Scaling GitHub
holman
458
140k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
It's Worth the Effort
3n
183
27k
Agile that works and the tools we love
rasmusluckow
327
21k
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 引用