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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Kento Nishio
March 25, 2025
Programming
130
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
41
2023 MRS Fall Meeting & Exhibit
ken2403
0
51
sqlcを新規サービスに採用してみた!
ken2403
3
2.2k
Other Decks in Programming
See All in Programming
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
120
Webフレームワークの ベンチマークについて
yusukebe
0
170
スマートグラスで並列バイブコーディング
hyshu
0
150
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
5.4k
C# and C++ Interoperability - cho-dotnetnew
harukasao
0
170
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.3k
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
260
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
200
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
150
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.3k
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
120
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
140
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
200
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
780
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
530
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
270
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
590
For a Future-Friendly Web
brad_frost
183
10k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
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 インターフェースの実装方法