Slide 1

Slide 1 text

sqlx の実装を読んでみた話 Go Connect #2 2024.09.04

Slide 2

Slide 2 text

自己紹介 Sugar Sato (@satoIsSugar) ● 2023年 BuySell Technologies入社 ● 基盤チーム所属(Portal/Account/Approval) PjM ○ アソシエイトマネージャー ● Go / Angular / Serverless ○ Go歴: 4年くらい ● 熱帯植物 ○ ビカクシダ ● 猫 ○ Lambda (♀ 2才)

Slide 3

Slide 3 text

プロダクト群「バイセルリユースプラットフォーム Cosmos」の開発が進行中 リユースに必要なすべての機能を提供する 「リユースプラットフォーム Cosmos」の開発が進行中です。 Cosmosを活用して、バイセルグループ全体での業務効率改善やデータドリブン経営の深化を目指しています。 リユースプラットフォーム Cosmos 自社開発のリユース特化業務基幹システムでありサービス群の集合体 買取申込 買取・査定 在庫管理 販売 多様なチャネルで収益最大化 CRM -顧客対応- 買取種別に応じた最適なシステム構築 Visit -訪問買取 - Store -店舗買取 - Promas -商材マスタ - Appraisal -専門査定 - Stock -在庫管理 - EXS -販売管理 - Core -会員管理- Portal -データ利用- Pocket -データ基盤- 買取 専門チームによる真贋・査定と連携 査定 申込 効率的な顧客対応 在庫 在庫管理の最適・効率化 販売 データ 各事業プロセスにある データを一元管理 :基幹システム

Slide 4

Slide 4 text

アジェンダ sqlx とは 01 実装を読んでみた 02 まとめ 03

Slide 5

Slide 5 text

sqlx とは

Slide 6

Slide 6 text

● > sqlx is a library which provides a set of extensions on go's standard database/sql library ○ database/sql に拡張機能を追加する ○ 元のインターフェースに影響を与えない ■ 構造体やマップ、スライスへの行マッピング ■ 名前付きパラメータのサポート ■ クエリから構造体への変換 sqlx

Slide 7

Slide 7 text

● 使い方 sqlx

Slide 8

Slide 8 text

実装を読んでみた

Slide 9

Slide 9 text

● 7ファイル (※ go.* / test / doc を除く) ○ go.mod : 1.10 → 非推奨な記述アリ 実装ファイル

Slide 10

Slide 10 text

今日は時間がないので 1メソッドだけピックアップします

Slide 11

Slide 11 text

● ドライバが実行可能なクエリ取得 ○ その結果に対して Exec を実行 ○ バインディング or クエリ実行自体のエラーを返す ● バッチインサート可能 NamedExecContext

Slide 12

Slide 12 text

へぇ〜バッチインサートできるんだ 実装はどうなっているんだろう

Slide 13

Slide 13 text

NamedExecContext

Slide 14

Slide 14 text

NamedExecContext

Slide 15

Slide 15 text

● 名前付きパラメータのバインディング ○ 名前付きパラメータを具体的なプレースホルダ(例: ? または $1) と対応する値のスライス変換 ● クエリの実行 NamedExecContext

Slide 16

Slide 16 text

bindNamedMapper

Slide 17

Slide 17 text

● 型と種別チェック ● 名前付きパラメータの バインディング ○ map ○ array / slice ○ struct bindNamedMapper

Slide 18

Slide 18 text

convertMapStringInterface ● 型変換チェック ● 型変換

Slide 19

Slide 19 text

bindMap / bindStruct / bindArray ● 共通部分 ○ compileNamedQuery ○ bind***Args ● bindArray ○ バッチインサート部分 ○ 引数リストを生成してい る ○ プレースホルダーのリ バインドしている

Slide 20

Slide 20 text

bindMap / bindStruct / bindArray

Slide 21

Slide 21 text

fixBound

Slide 22

Slide 22 text

fixBound ● バッチインサートのため に SQL クエリを適切な 形式に変換する ○ 複数のレコードを一 度に挿入するための VALUES 句を繰り返 し追加

Slide 23

Slide 23 text

findMatchingClosingBracketIndex ● 最初に開いた丸括弧と閉 じ丸括弧のインデックスを 探す

Slide 24

Slide 24 text

compileNamedQuery

Slide 25

Slide 25 text

compileNamedQuery ● 処理 ○ 名前付きパラメータの解析 ○ クエリと名前リストを返す ● 問題点 ○ マルチバイト文字を含んだ名前付きパラメータが正しく認識でき ない

Slide 26

Slide 26 text

compileNamedQuery ● 名前付きパラメータ(:) の検出 ● エスケープシーケンス 処理

Slide 27

Slide 27 text

compileNamedQuery ● 名前付きパラメータ (:=)の検出 ● 許可された文字セット の判定 ○ [A-z0-9_.] ○ 末尾の文字じゃな いこと

Slide 28

Slide 28 text

compileNamedQuery ● 名前のリスト追加 ● bindType の形式に応 じた変換 ● byte の追加

Slide 29

Slide 29 text

● 現在の文字(byte)が名前付きパラメータの一部でもない ● 特殊なケース(エスケープシーケンスやキーバリューなど)に該当しない通 常の文字 compileNamedQuery

Slide 30

Slide 30 text

という感じで NamedExecContext 内でクエリ実行されます!

Slide 31

Slide 31 text

まとめ

Slide 32

Slide 32 text

まとめ ● sqlx について理解が深まった ● ファイル数が少ない ● シンプルな記述で読みやすい ● reflectの勉強にもちょうどいいかも ○ e.g. 動的処理を自作する際の参考にするなど

Slide 33

Slide 33 text

sqlx 読んでみたら楽しかったぞ ということで

Slide 34

Slide 34 text

Thank you

Slide 35

Slide 35 text

● https://github.com/jmoiron/sqlx ● https://pkg.go.dev/github.com/jmoiron/sqlx?utm_source=godoc 引用