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
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
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.7k
Inside Stream API
skrb
1
730
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.1k
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
180
AI 輔助遺留系統現代化的經驗分享
jame2408
1
510
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
110
Contextとはなにか
chiroruxx
1
330
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
140
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
250
AI時代のUIはどこへ行く?その2!
yusukebe
21
7.3k
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
550
New "Type" system on PicoRuby
pocke
1
960
Featured
See All Featured
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
56k
WENDY [Excerpt]
tessaabrams
11
38k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
330
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
230
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.9k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
480
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
Designing Experiences People Love
moore
143
24k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1.1k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
260
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 インターフェースの実装方法