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

Information Schemaから自動生成する型付きORM spannent

Information Schemaから自動生成する型付きORM spannent

Khmer495

June 02, 2023
Tweet

More Decks by Khmer495

Other Decks in Programming

Transcript

  1. 自己紹介
 久米 祐貴(くめ ゆうき) / くめーる
 
 株式会社サイバーエージェント 2021年度 新卒入社


     AI事業本部 小売DX領域
  ~2022/4 広告配信基盤の運用保守
  2022/5~ 小売企業のアプリの開発・運用保守
 
 Goの経験:3年(実務は1年)
 
 @Khmer495
 @kume_ru

  2. Update
 • Userテーブルに対するUpdate用の
 メソッドを生成
 ◦ 引数にPrimary Key
 • メソッドチェーンで記述可
 •

    型付き(DBとGoの型を対応)
 DB
 Go
 STRING, NOT NULL
 string
 INT64, NULLABLE
 *int64

  3. Select
 • Userテーブルに対するSelect用の
 メソッドを生成
 ◦ 引数にPrimary Key
 • 可変長引数でカラムを指定
 •

    テーブル単位のstruct
 DB
 Go
 STRING, NOT NULL
 string
 INT64, NULLABLE
 spanner.NullInt64

  4. 作った背景
 • DBにGoogle Cloud Spannerを使用
 ◦ interfaceはGoogle 標準 SQL
 ▪

    なお2022/06にPostgreSQLも対応している
 
 • 開発当時(2022/05)GoドライバはGAしていない
 ◦ 2022/09にGA
 
 • 対応するORMも少ない
 ◦ メルカリ社製のyo(https://github.com/cloudspannerecosystem/yo)
 ◦ ORMではないが公式のSDK
 
 • 求めているORMはなかった

  5. 作った背景
 • DBにGoogle Cloud Spannerを使用
 ◦ interfaceはGoogle 標準 SQL
 ▪

    なお2022/06にPostgreSQLも対応している
 
 • 開発当時(2022/05)GoドライバはGAしていない
 ◦ 2022/09にGA
 
 • 対応するORMも少ない
 ◦ メルカリ社製のyo(https://github.com/cloudspannerecosystem/yo)
 ◦ ORMではないが公式のSDK
 
 • 求めているORMはなかった
 なければ作る

  6. 実現したいこと
 • CRUDのCUDに関してGoで完結すること
 ◦ 完結する=
 ▪ DBの定義を見なくても良い=テーブル、カラム、 nullable、型などがGoで分かる
 ▪ SQLを書かなくて良い


    ◦ 完結しないのであれば公式の SDKで良い
 ◦ Rは複雑になりがちでクエリビルダを自作するのは大変、生の SQLを書くことが多い
 ▪ 最終的にはテーブル単位の( Joinなしの)Rのみ作った
 
 • 上記を実現するためにスキーマ駆動であること
 ◦ スキーマ駆動=DBのスキーマからGoのコードを生成、またはその逆と 
 ◦ 一番理想に近いORMがent(https://entgo.io/)
 ▪ ただしentはSpannerに未対応

  7. 実装方針
 • 基本方針はentを参考にした
 
 • ただしentはGoでスキーマを定義しDBにマイグレーションをかける
 ◦ Go => DB


    ◦ マイグレーション自作はあまりやりたくない 
 
 • よってInformation SchemaからGoのコードを生成する
 ◦ DB => Go
 ◦ yoがそのパターンなので参考にした 

  8. Information Schemaとは
 データベースメタデータが載っているテーブル群
 • テーブルの
 ◦ 名前
 ◦ カラム一覧
 •

    カラムの
 ◦ 名前
 ◦ 型
 ◦ インデックス
 ◦ nullable
 等
 RDBだけでなくデータウェアハウス
 (BigQueryやSnowflakeなど)にも
 存在することがある
 
 Information Schemaがなくても相当する
 メタデータは基本的に取得できるはずなので
 応用可能