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
sqlc で geometry 型を扱うときに気をつけるべきこと
Search
Kento Nishio
March 25, 2025
Programming
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
sqlc で geometry 型を扱うときに気をつけるべきこと
Kento Nishio
March 25, 2025
More Decks by Kento Nishio
See All by Kento Nishio
Devinを爆速でプロダクト開発に導入する方法
ken2403
0
42
2023 MRS Fall Meeting & Exhibit
ken2403
0
54
sqlcを新規サービスに採用してみた!
ken2403
3
2.2k
Other Decks in Programming
See All in Programming
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
AIエージェントで 変わるAndroid開発環境
takahirom
2
610
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
2
310
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.4k
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
260
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
170
フィードバックで育てるAI開発
kotaminato
1
110
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
1
670
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
170
Featured
See All Featured
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
870
Producing Creativity
orderedlist
PRO
348
40k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
340
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.6k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
We Have a Design System, Now What?
morganepeng
55
8.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
600
Being A Developer After 40
akosma
91
590k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
Un-Boring Meetings
codingconduct
0
340
Transcript
Product Development Division GENDA © GENDA Inc. 1 GENDA Product
Development Division 2025.03.25 sqlc で geometry 型を扱うときに気をつけるべきこと
Product Development Division GENDA © GENDA Inc. 2 自己紹介 GENDA
プロダクト開発部 新卒第一号エンジニア 名前 西尾 健人 GitHub ken2403 技術スタック • Go • TypeScript • Python 好きなこと • データ分析、DLモデルの開発・実装 • BE開発・設計 fanfancy+ with GiGO 店舗会員アプリ BE・Mobile・FE開発 カラオケBanBan 会員管理基盤・アプリ BE・FE開発 GENDA IDを使った リライングパーティの実装 BE開発
Product Development Division GENDA © GENDA Inc. 3 エンタメ経済圏の完成 国内事業の着実な業績拡大と積極的な海外事業展開がもたらす連続的な成長を基盤にし、
エンタメ・プラットフォームとエンタメ・コンテンツの両領域におけるM&Aを積み重ね、 グローバルに展開する「GENDAエンタメ経済圏」の構築を目指します。 このようにして、事業ポートフォリオを盤石にすることで、 「千変万化」なエンタメ事業のボラティリティを超えていけると考えています 。 当社の成長戦略 =「エンタメ業界でのM&A」
Product Development Division GENDA © GENDA Inc. 4 GENDAグループの「エンタメ・プラットフォーム」数は2,228に(8月末時点) エンタメ・プラットフォーム数
2021 2022 2023 2024 ミニロケ拠点数 1,449箇所 国内:880箇所 海外:569箇所 ※2024年8月末時点 (箇所) 2021 2022 2023 2024 (店舗) 店舗数 779店舗 国内AM:333店舗 国内カラオケ:366店舗 国内F&B:59店舗 国内その他:2店舗 国内その他:2店舗 海外F&B:1店舗 ※2024年8月末時点 注:ミニロケは、スタッフの常駐しないゲームコーナー。
Product Development Division GENDA © GENDA Inc. システムの内製化による顧客体験向上 & 業務効率化
カラオケBanBanでの取り組み 5 グループイン後 CRM強化 UI/UX改善 運用フローの 改善 客数・客単価 UP 運用負荷低減 GENDAグループイン後のPMIの一環として、顧客管理基盤システムを 完全内製でフルリプレイスしました。会員向けアプリのUI/UXを改善し、 管理・運用フローも見直しつつシステムを再構成しました。 完全内製化によって、今後の開発速度および柔軟性も爆発的に向上しています。 顧客管理基盤システム 店舗POS レジ 新会員 アプリ 管理画面 WFツール
Product Development Division GENDA © GENDA Inc. 6 01 今日お話しすること
02 03 sqlc を使って PostGIS の geometry 型を扱う方法 sqlc 公式推奨方法と実際の実装の違い Type Override の実装方法 sqlc で geomtry 型を扱う際の公式推奨とは違う実装方法を選択した理由と方法を説明します。 sqldriver が正しく値を読み出せる / 書き込めるように Scanner と Valuer インターフェースを実装する方法を説明します。 sqlc x PostGIS x geomtry を使う際の注意点と Type Override について説明します。
Product Development Division GENDA © GENDA Inc. sqlc とは?? Go製の
“SQLクエリ→型安全なコード生成” ツール sqlc を使って PostGIS の geometry 型を扱う方法 7 2024/06/14 golang.tokyo で発表 • スキーマからテーブル定義を解析 • SQLファイルに直接クエリを記述 • 型安全なGoコードを自動生成 主な特徴 • 複雑なクエリも型安全に扱える • マイグレーション後の型の不一致をコンパイル時に検出 • 生SQLの記述でパフォーマンス最適化が容易 他のORMとの違い • クエリはSQLで直接記述、SQLの完全な制御が可能 • 似たクエリが乱立しないように管理する必要がある
Product Development Division GENDA © GENDA Inc. PostGIS と geometry
型とは?? sqlc を使って PostGIS の geometry 型を扱う方法 8 PostGIS • 地理空間データを地理空間情報を扱うためのPostgreSQL拡張 • 有効にすると、空間データを扱うのに便利な複数のデータ型と関数が使えるようになる • GIST Indexによる高速な検索もサポート geomtry型とgeography型 地理空間データを平面座標系で扱えるPostgreSQLのデータ型 geometry geography 特徴 平面座標系を使用して、地図を平面に 投影した位置情報をX/Y座標で表す 楕円体球面座標系を使用して、地球を楕円 体として扱い、位置情報を緯度/経度で表す 計算方法 平面上の計算なので単純で高速 曲面上の計算なのでより複雑で計算コスト が高い 精度 局所的な地域では十分な精度 広域になると歪みによる誤差が生じる 地球全体を扱う場合でも正確な計算が可能
Product Development Division GENDA © GENDA Inc. sqlc で Type
Override を設定する方法 Go のコードに出力する際の型を明示的に指定することができる sqlc を使って PostGIS の geometry 型を扱う方法 9 • sqlc.yml / sqlc.json の設定ファイルに db_type / column ↔ go_type の形式で明示的に指定可能 • geometry 型の場合、明示的に指定しないと interface{} に変換されてしまう • override した型にDBの値を読み取ったり、DBに 書き込む際には Scanner と Valuer インター フェースを満たす必要がある(後述)
Product Development Division GENDA © GENDA Inc. sqlc で geometry
型を扱う公式推奨方法 geometry 型を github.com/twpayne/go-geom の ewkb.Point 型に overrideする sqlc 公式推奨方法と実際の実装の違い 10 • EWKB (Extended Well-Known Binary) 形式を扱うための型 • Scanner と Valuer インターフェースを満たしている • Value() の実装において、返り値が Byte 文字列をとなるように実装されて いるので、PostgreSQL の binary_parameters=yes に設定する必要がある
Product Development Division GENDA © GENDA Inc. binary_parameters=yes の影響 既存クエリが膨大にあるため影響が測れない
sqlc 公式推奨方法と実際の実装の違い 11 • パラメータがバイナリ形式で送信されるのでパフォーマンスが向上する(場合が多い) • デフォルトでは no になっている 潜在的な影響 • 既存クエリの動作変化の可能性 • 文字列エスケープの扱いが変わる • プリペアドステートメントの挙動変化 • デバッグのしづらさ • 既存型の Value() メソッドへの影響
Product Development Division GENDA © GENDA Inc. 我々の選択 ewkb.Point のラッパー構造体を定義して、Value()
と Scan() メソッドを定義する sqlc 公式推奨方法と実際の実装の違い 12 • github.com/twpayne/go-geom/encoding/ewkbhex に16進文字列にEncode / Decode する 便利なメソッドがあるので実装は難しくない
Product Development Division GENDA © GENDA Inc. 実装例: Location型の定義 Type
Override の実装方法 13 • ewkb.Point のラッパー構造体を定義 • 緯度経度から Location 型を生成
Product Development Division GENDA © GENDA Inc. 実装例: Valuerインターフェース Type
Override の実装方法 14 • ewkbhex.Encode() 関数で16進文字列にEncode
Product Development Division GENDA © GENDA Inc. 実装例: Scannerインターフェース Type
Override の実装方法 15 • ewkbhex.Decode() 関数で16進文字列から ewkb.Point に変換
Product Development Division GENDA © GENDA Inc. メリットたくさん!実装も楽ちん! まとめ 16
メリット • binary_parameters=yes設定不要 ◦ 既存のシステムへ影響なく導入可能 • 独自の Location 型に便利なメソッドを追加可能 ◦ Latitude()、Longitude()など • Scanner も Valuer もewkbhex パッケージを使えば楽に実装ができる まとめ • sqlc で PostGIS の geometry 型を扱う方法 • 公式推奨は binary_parameters=yes だが影響範囲が不明確 • カスタム型による解決策の実装方法 ◦ driver.Valuer と sql.Scanner インターフェースの実装方法