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
Information Schemaから自動生成する型付きORM spannent
Search
Khmer495
June 02, 2023
Programming
690
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Information Schemaから自動生成する型付きORM spannent
https://gocon.jp/2023/sessions/LT4/
Khmer495
June 02, 2023
More Decks by Khmer495
See All by Khmer495
Google Cloud Spannerにおけるページネーションとインデックスの考え方
khmer495
0
5.9k
Other Decks in Programming
See All in Programming
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1k
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
120
What's New in Android 2026
veronikapj
0
240
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
240
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
200
数百円から始めるRuby電子工作
tarosay
0
120
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
360
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
200
React本体のコードリーディング
high_g_engineer
1
130
テーブルをDELETEした
yuzneri
0
130
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
470
AIが無かった頃の素敵な出会いの話
codmoninc
1
350
Featured
See All Featured
Building Applications with DynamoDB
mza
96
7.2k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
460
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
KATA
mclloyd
PRO
35
15k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
430
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
380
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
My Coaching Mixtape
mlcsv
0
190
What's in a price? How to price your products and services
michaelherold
247
13k
The browser strikes back
jonoalderson
0
1.4k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
620
Transcript
Information Schemaから 自動生成する型付きORM spannent 久米 祐貴 / くめーる Twitter:@kume_ru Github:@Khmer495
自己紹介 久米 祐貴(くめ ゆうき) / くめーる 株式会社サイバーエージェント 2021年度 新卒入社
AI事業本部 小売DX領域 ~2022/4 広告配信基盤の運用保守 2022/5~ 小売企業のアプリの開発・運用保守 Goの経験:3年(実務は1年) @Khmer495 @kume_ru
早速作ったものの紹介 自動生成したSpannerの ORMの使い方
Insert • Userテーブルに対するInsert用の メソッドを生成 • メソッドチェーンで記述可 • 型付き(DBとGoの型を対応) DB Go
STRING, NOT NULL string INT64, NULLABLE *int64
Update • Userテーブルに対するUpdate用の メソッドを生成 ◦ 引数にPrimary Key • メソッドチェーンで記述可 •
型付き(DBとGoの型を対応) DB Go STRING, NOT NULL string INT64, NULLABLE *int64
Select • Userテーブルに対するSelect用の メソッドを生成 ◦ 引数にPrimary Key • 可変長引数でカラムを指定 •
テーブル単位のstruct DB Go STRING, NOT NULL string INT64, NULLABLE spanner.NullInt64
作った背景 • 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はなかった
作った背景 • 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はなかった なければ作る
実現したいこと • CRUDのCUDに関してGoで完結すること ◦ 完結する= ▪ DBの定義を見なくても良い=テーブル、カラム、 nullable、型などがGoで分かる ▪ SQLを書かなくて良い
◦ 完結しないのであれば公式の SDKで良い ◦ Rは複雑になりがちでクエリビルダを自作するのは大変、生の SQLを書くことが多い ▪ 最終的にはテーブル単位の( Joinなしの)Rのみ作った • 上記を実現するためにスキーマ駆動であること ◦ スキーマ駆動=DBのスキーマからGoのコードを生成、またはその逆と ◦ 一番理想に近いORMがent(https://entgo.io/) ▪ ただしentはSpannerに未対応
実装方針 • 基本方針はentを参考にした • ただしentはGoでスキーマを定義しDBにマイグレーションをかける ◦ Go => DB
◦ マイグレーション自作はあまりやりたくない • よってInformation SchemaからGoのコードを生成する ◦ DB => Go ◦ yoがそのパターンなので参考にした
Information Schemaとは データベースメタデータが載っているテーブル群 • テーブルの ◦ 名前 ◦ カラム一覧 •
カラムの ◦ 名前 ◦ 型 ◦ インデックス ◦ nullable 等 RDBだけでなくデータウェアハウス (BigQueryやSnowflakeなど)にも 存在することがある Information Schemaがなくても相当する メタデータは基本的に取得できるはずなので 応用可能
テンプレを作る 1. 生成物を手で書いてみる 2. 変数にしたい場所を明確にし、テンプレートにする 3. 変数をInformation Schemaから取得するコードを書く
必要があれば加工する 自動生成したコードの使い方 自動生成したコード テンプレ
テンプレを作る 1. 生成物を手で書いてみる 2. 変数にしたい場所を明確にし、テンプレートにする 3. 変数をInformation Schemaから取得するコードを書く
必要があれば加工する 自動生成したコード テンプレ
テンプレを作る 1. 生成物を手で書いてみる 2. 変数にしたい場所を明確にし、テンプレートにする 3. 変数をInformation Schemaから取得するコードを書く
必要があれば加工する テンプレに必要なデータの型 Information Schemaから作った値
応用例 • Information SchemaからSnowflakeのテーブル定義書を作成 > データベースのテーブル定義の仕様書を自動生成しよう https://developers.cyberagent.co.jp/blog/archives/35959/
ありがとうございました