Upgrade to Pro — share decks privately, control downloads, hide ads and more …

sqlc で geometry 型を扱うときに気をつけるべきこと

sqlc で geometry 型を扱うときに気をつけるべきこと

Avatar for Kento Nishio

Kento Nishio

March 25, 2025
Tweet

More Decks by Kento Nishio

Other Decks in Programming

Transcript

  1. Product Development Division GENDA © GENDA Inc. 1 GENDA Product

    Development Division 2025.03.25 sqlc で geometry 型を扱うときに気をつけるべきこと
  2. 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開発
  3. Product Development Division GENDA © GENDA Inc. 3 エンタメ経済圏の完成 国内事業の着実な業績拡大と積極的な海外事業展開がもたらす連続的な成長を基盤にし、

    エンタメ・プラットフォームとエンタメ・コンテンツの両領域におけるM&Aを積み重ね、 グローバルに展開する「GENDAエンタメ経済圏」の構築を目指します。 このようにして、事業ポートフォリオを盤石にすることで、 「千変万化」なエンタメ事業のボラティリティを超えていけると考えています 。 当社の成長戦略 =「エンタメ業界でのM&A」
  4. 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月末時点 注:ミニロケは、スタッフの常駐しないゲームコーナー。
  5. Product Development Division GENDA © GENDA Inc. システムの内製化による顧客体験向上 & 業務効率化

    カラオケBanBanでの取り組み 5 グループイン後 CRM強化 UI/UX改善 運用フローの 改善 客数・客単価 UP 運用負荷低減 GENDAグループイン後のPMIの一環として、顧客管理基盤システムを 完全内製でフルリプレイスしました。会員向けアプリのUI/UXを改善し、 管理・運用フローも見直しつつシステムを再構成しました。 完全内製化によって、今後の開発速度および柔軟性も爆発的に向上しています。 顧客管理基盤システム 店舗POS レジ 新会員 アプリ 管理画面 WFツール
  6. 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 について説明します。
  7. Product Development Division GENDA © GENDA Inc. sqlc とは?? Go製の

    “SQLクエリ→型安全なコード生成” ツール sqlc を使って PostGIS の geometry 型を扱う方法 7 2024/06/14 golang.tokyo で発表 • スキーマからテーブル定義を解析 • SQLファイルに直接クエリを記述 • 型安全なGoコードを自動生成 主な特徴 • 複雑なクエリも型安全に扱える • マイグレーション後の型の不一致をコンパイル時に検出 • 生SQLの記述でパフォーマンス最適化が容易 他のORMとの違い • クエリはSQLで直接記述、SQLの完全な制御が可能 • 似たクエリが乱立しないように管理する必要がある
  8. Product Development Division GENDA © GENDA Inc. PostGIS と geometry

    型とは?? sqlc を使って PostGIS の geometry 型を扱う方法 8 PostGIS • 地理空間データを地理空間情報を扱うためのPostgreSQL拡張 • 有効にすると、空間データを扱うのに便利な複数のデータ型と関数が使えるようになる • GIST Indexによる高速な検索もサポート geomtry型とgeography型 地理空間データを平面座標系で扱えるPostgreSQLのデータ型 geometry geography 特徴 平面座標系を使用して、地図を平面に 投影した位置情報をX/Y座標で表す 楕円体球面座標系を使用して、地球を楕円 体として扱い、位置情報を緯度/経度で表す 計算方法 平面上の計算なので単純で高速 曲面上の計算なのでより複雑で計算コスト が高い 精度 局所的な地域では十分な精度 広域になると歪みによる誤差が生じる 地球全体を扱う場合でも正確な計算が可能
  9. 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 インター フェースを満たす必要がある(後述)
  10. 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 に設定する必要がある
  11. Product Development Division GENDA © GENDA Inc. binary_parameters=yes の影響 既存クエリが膨大にあるため影響が測れない

    sqlc 公式推奨方法と実際の実装の違い 11 • パラメータがバイナリ形式で送信されるのでパフォーマンスが向上する(場合が多い) • デフォルトでは no になっている 潜在的な影響 • 既存クエリの動作変化の可能性 • 文字列エスケープの扱いが変わる • プリペアドステートメントの挙動変化 • デバッグのしづらさ • 既存型の Value() メソッドへの影響
  12. Product Development Division GENDA © GENDA Inc. 我々の選択 ewkb.Point のラッパー構造体を定義して、Value()

    と Scan() メソッドを定義する sqlc 公式推奨方法と実際の実装の違い 12 • github.com/twpayne/go-geom/encoding/ewkbhex に16進文字列にEncode / Decode する 便利なメソッドがあるので実装は難しくない
  13. Product Development Division GENDA © GENDA Inc. 実装例: Location型の定義 Type

    Override の実装方法 13 • ewkb.Point のラッパー構造体を定義 • 緯度経度から Location 型を生成
  14. Product Development Division GENDA © GENDA Inc. 実装例: Valuerインターフェース Type

    Override の実装方法 14 • ewkbhex.Encode() 関数で16進文字列にEncode
  15. Product Development Division GENDA © GENDA Inc. 実装例: Scannerインターフェース Type

    Override の実装方法 15 • ewkbhex.Decode() 関数で16進文字列から ewkb.Point に変換
  16. 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 インターフェースの実装方法