Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
sqlc で geometry 型を扱うときに気をつけるべきこと
Search
Kento Nishio
March 25, 2025
Programming
150
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
連続的なM&Aを支える、 テクノロジーPMI人材をスケールさせるための取り組み
ken2403
0
11
AIが見張り、人がもてなす
ken2403
0
10
Devinを爆速でプロダクト開発に導入する方法
ken2403
0
45
2023 MRS Fall Meeting & Exhibit
ken2403
0
61
sqlcを新規サービスに採用してみた!
ken2403
3
2.3k
Other Decks in Programming
See All in Programming
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
290
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
190
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
AIに “答え“を書かせるのを やめてみた
___akari11
0
120
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
270
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
160
Web Framework Benchmark Battle 2026, Any%
a_matsuda
2
2k
SalesForceを内製化!? ~ HR事業を支える顧客管理基盤のインフラを大公開 ~
oku053
0
180
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
160
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
3.2k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
The Curse of the Amulet
leimatthew05
3
16k
HDC tutorial
michielstock
2
960
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
How to train your dragon (web standard)
notwaldorf
96
6.9k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
Unsuck your backbone
ammeep
672
58k
The Invisible Side of Design
smashingmag
301
52k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
Marketing to machines
jonoalderson
1
5.9k
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 インターフェースの実装方法