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. Information Schemaから

    自動生成する型付きORM

    spannent

    久米 祐貴 / くめーる

    Twitter:@kume_ru

    Github:@Khmer495


    View Slide

  2. 自己紹介

    久米 祐貴(くめ ゆうき) / くめーる


    株式会社サイバーエージェント 2021年度 新卒入社

     AI事業本部 小売DX領域

     ~2022/4 広告配信基盤の運用保守

     2022/5~ 小売企業のアプリの開発・運用保守


    Goの経験:3年(実務は1年)


    @Khmer495

    @kume_ru


    View Slide

  3. 早速作ったものの紹介


    自動生成したSpannerの

    ORMの使い方


    View Slide

  4. Insert

    ● Userテーブルに対するInsert用の

    メソッドを生成

    ● メソッドチェーンで記述可

    ● 型付き(DBとGoの型を対応)

    DB
 Go

    STRING, NOT NULL
 string

    INT64, NULLABLE
 *int64


    View Slide

  5. Update

    ● Userテーブルに対するUpdate用の

    メソッドを生成

    ○ 引数にPrimary Key

    ● メソッドチェーンで記述可

    ● 型付き(DBとGoの型を対応)

    DB
 Go

    STRING, NOT NULL
 string

    INT64, NULLABLE
 *int64


    View Slide

  6. Select

    ● Userテーブルに対するSelect用の

    メソッドを生成

    ○ 引数にPrimary Key

    ● 可変長引数でカラムを指定

    ● テーブル単位のstruct

    DB
 Go

    STRING, NOT NULL
 string

    INT64, NULLABLE
 spanner.NullInt64


    View Slide

  7. 作った背景

    ● 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はなかった


    View Slide

  8. 作った背景

    ● 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はなかった
 なければ作る


    View Slide

  9. 実現したいこと

    ● CRUDのCUDに関してGoで完結すること

    ○ 完結する=

    ■ DBの定義を見なくても良い=テーブル、カラム、 nullable、型などがGoで分かる

    ■ SQLを書かなくて良い

    ○ 完結しないのであれば公式の SDKで良い

    ○ Rは複雑になりがちでクエリビルダを自作するのは大変、生の SQLを書くことが多い

    ■ 最終的にはテーブル単位の( Joinなしの)Rのみ作った


    ● 上記を実現するためにスキーマ駆動であること

    ○ スキーマ駆動=DBのスキーマからGoのコードを生成、またはその逆と 

    ○ 一番理想に近いORMがent(https://entgo.io/)

    ■ ただしentはSpannerに未対応


    View Slide

  10. 実装方針

    ● 基本方針はentを参考にした


    ● ただしentはGoでスキーマを定義しDBにマイグレーションをかける

    ○ Go => DB

    ○ マイグレーション自作はあまりやりたくない 


    ● よってInformation SchemaからGoのコードを生成する

    ○ DB => Go

    ○ yoがそのパターンなので参考にした 


    View Slide

  11. Information Schemaとは

    データベースメタデータが載っているテーブル群

    ● テーブルの

    ○ 名前

    ○ カラム一覧

    ● カラムの

    ○ 名前

    ○ 型

    ○ インデックス

    ○ nullable

    等

    RDBだけでなくデータウェアハウス

    (BigQueryやSnowflakeなど)にも

    存在することがある


    Information Schemaがなくても相当する

    メタデータは基本的に取得できるはずなので

    応用可能


    View Slide

  12. テンプレを作る

    1. 生成物を手で書いてみる 

    2. 変数にしたい場所を明確にし、テンプレートにする 

    3. 変数をInformation Schemaから取得するコードを書く 

    必要があれば加工する 

    自動生成したコードの使い方

    自動生成したコード

    テンプレ


    View Slide

  13. テンプレを作る

    1. 生成物を手で書いてみる 

    2. 変数にしたい場所を明確にし、テンプレートにする 

    3. 変数をInformation Schemaから取得するコードを書く 

    必要があれば加工する 

    自動生成したコード

    テンプレ


    View Slide

  14. テンプレを作る

    1. 生成物を手で書いてみる 

    2. 変数にしたい場所を明確にし、テンプレートにする 

    3. 変数をInformation Schemaから取得するコードを書く 

    必要があれば加工する 

    テンプレに必要なデータの型

    Information Schemaから作った値


    View Slide

  15. 応用例

    ● Information SchemaからSnowflakeのテーブル定義書を作成

    > データベースのテーブル定義の仕様書を自動生成しよう

    https://developers.cyberagent.co.jp/blog/archives/35959/


    View Slide

  16. ありがとうございました

    View Slide