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
wrench - Schema Management Tool for Cloud Spann...
Search
Yuki Ito
February 06, 2020
Technology
1.5k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
wrench - Schema Management Tool for Cloud Spanner -
Yuki Ito
February 06, 2020
More Decks by Yuki Ito
See All by Yuki Ito
newmo の創業を支える Software Architecture と Platform Engineering
110y
5
3.7k
Modular Monolith Go Server with GraphQL Federation + gRPC
110y
1
1.2k
Modular Monolith + Go @ newmo
110y
1
1.3k
Go + GraphQL @ newmo
110y
3
1k
Architect / Platform Team at KAUCHE
110y
1
720
Cloud Run + Observability / Reliability @ KAUCHE
110y
0
680
Cloud Run CI/CD + QA @ KAUCHE
110y
1
690
Microservices on Cloud Run @ KAUCHE
110y
0
330
KAUCHE Loves Go
110y
0
540
Other Decks in Technology
See All in Technology
Bet AI Day 2026丨バクラク Autopilot、業務システムの再設計
layerx
PRO
1
770
Genie Code ワークショップ 基礎編 / Genie-Code-Workshop-fundamental
databricksjapan
PRO
0
280
いま、生成AIにKaggleをどこまで 任せられるか — ROGIIコンペでの進め方とTips
k951286
0
670
Does an AI Watermark Survive Translation?
machinetranslation
0
510
人気商品が「ちゃんと買える」をつくる ー ECの負荷改善
ykagano
1
180
Bet AI Day 2026丨How We Bet AI: AIとともに働く場をつくる
layerx
PRO
0
1.5k
書籍『生成AIの安全性入門』の入門
wataoka
0
150
分割40%キーボードにスムーズに入門するには
hoto17296
1
210
Point Cloud as a Foreign Language for Multi-modal Large Language Model
takmin
0
360
Nav2、Nav3 ... はたまた自作?〜 作って理解する Nav3 の設計意図 〜 / Nav2, Nav3 ... or Build Your Own? — Understanding Nav3's design intent by building it from scratch
yanzm
0
140
データエンジニアの困りごとをDevinと一緒に解消する
10xinc
2
180
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
2
1.6k
Featured
See All Featured
Marketing to machines
jonoalderson
1
5.7k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
Designing Experiences People Love
moore
143
24k
What's in a price? How to price your products and services
michaelherold
247
13k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Everyday Curiosity
cassininazir
0
300
First, design no harm
axbom
PRO
2
1.3k
Raft: Consensus for Rubyists
vanstee
141
7.7k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Crafting Experiences
bethany
1
270
The browser strikes back
jonoalderson
0
1.6k
Transcript
wrench - Schema Management Tool for Cloud Spanner - GCPUG
Spanner Day Yuki Ito
Merpay Architect Team Backend Engineer Yuki Ito
wrench ʮGoͷ৽ػೳΛͬͨDBεΩʔϚ ཧπʔϧʯ https://gihyo.jp/magazine/SD/archive/2019/201911
wrench https://github.com/mercari/wrench https://hub.docker.com/r/mercari/wrench
wrench > wrench help Usage: wrench [command] Available Commands: create
drop reset load apply migrate
wrench create > cat ./_examples/schema.sql CREATE TABLE Singers ( SingerID
STRING(36) NOT NULL, FirstName STRING(1024), ) PRIMARY KEY(SingerID); > wrench create --directory ./_examples/
wrench create
wrench drop > wrench drop
wrench reset > wrench reset --directory ./_examples/
wrench load > wrench load --directory ./_examples/ > cat ./_examples/schema.sql
CREATE TABLE Singers ( SingerID STRING(36) NOT NULL, FirstName STRING(1024), ) PRIMARY KEY(SingerID);
wrench apply -ddl > cat ./_examples/ddl.sql ALTER TABLE Singers ADD
COLUMN LastName STRING(1024); > wrench apply --ddl ./_examples/ddl.sql
wrench apply -ddl
wrench apply -dml > cat ./_examples/dml.sql INSERT INTO Singers(SingerID, FirstName)
VALUES("1", "Yuki"); > wrench apply --dml ./_examples/dml.sql
wrench apply -dml
wrench migrate > cat ./_examples/migrations/000001.sql ALTER TABLE Singers ADD COLUMN
LastName STRING(1024); > wrench migrate up --directory ./_examples/ 1/up
wrench migrate
Development DB DB DB Instance
Development CREATE TABLE Singers ( SingerID STRING(36) NOT NULL, FirstName
STRING(1024), ) PRIMARY KEY(SingerID);
Development CREATE TABLE Singers ( SingerID STRING(36) NOT NULL, FirstName
STRING(1024), LastName STRING(1024), ) PRIMARY KEY(SingerID);
Development Apply Migration Load Schema Commit DDL Create DDL File
Write DDL Reset DB NG OK
Development > cat ./_examples/schema.sql CREATE TABLE Singers ( SingerID STRING(36)
NOT NULL, FirstName STRING(1024), ) PRIMARY KEY(SingerID);
Development
Development Apply Migration Load Schema Commit DDL Create DDL File
Write DDL Reset DB NG OK
Development > wrench migrate create --directory ./_examples/ _examples/migrations/000001.sql is created
> ls _examples/migrations/ 000001.sql
Development Apply Migration Load Schema Commit DDL Create DDL File
Write DDL Reset DB NG OK
Development > cat ./_examples/migrations/000001.sql ALTER TABLE Singers ADD COLUMN LastNamo
STRING(1024);
Development Apply Migration Load Schema Commit DDL Create DDL File
Write DDL Reset DB NG OK
Development > wrench migrate up --directory ./_examples/ 1/up
Development
Development typo!!
Development Apply Migration Load Schema Commit DDL Create DDL File
Write DDL Reset DB NG OK
Development > cat ./_examples/schema.sql CREATE TABLE Singers ( SingerID STRING(36)
NOT NULL, FirstName STRING(1024), ) PRIMARY KEY(SingerID); > wrench reset --directory ./_examples/
Development
Development Apply Migration Load Schema Commit DDL Create DDL File
Write DDL Reset DB NG OK
Development > cat ./_examples/migrations/000001.sql ALTER TABLE Singers ADD COLUMN LastName
STRING(1024);
Development Apply Migration Load Schema Commit DDL Create DDL File
Write DDL Reset DB NG OK
Development > wrench migrate up --directory ./_examples/ 1/up
Development
Development
Development Apply Migration Load Schema Commit DDL Create DDL File
Write DDL Reset DB NG OK
Development > wrench load --directory ./_examples/ > cat ./_examples/schema.sql CREATE
TABLE SchemaMigrations ( Version INT64 NOT NULL, Dirty BOOL NOT NULL, ) PRIMARY KEY(Version); CREATE TABLE Singers ( SingerID STRING(36) NOT NULL, FirstName STRING(1024), LastName STRING(1024), ) PRIMARY KEY(SingerID);
Development > wrench load --directory ./_examples/ > cat ./_examples/schema.sql CREATE
TABLE SchemaMigrations ( Version INT64 NOT NULL, Dirty BOOL NOT NULL, ) PRIMARY KEY(Version); CREATE TABLE Singers ( SingerID STRING(36) NOT NULL, FirstName STRING(1024), LastName STRING(1024), ) PRIMARY KEY(SingerID);
Development > wrench load --directory ./_examples/ > cat ./_examples/schema.sql CREATE
TABLE SchemaMigrations ( Version INT64 NOT NULL, Dirty BOOL NOT NULL, ) PRIMARY KEY(Version); CREATE TABLE Singers ( SingerID STRING(36) NOT NULL, FirstName STRING(1024), LastName STRING(1024), ) PRIMARY KEY(SingerID);
Development
Development Apply Migration Load Schema Commit DDL Create DDL File
Write DDL Reset DB NG OK
Development DB DB DB Instance
Deployment Create Tag Cloud Build Hook GCR Cloud Spanner GKE
Watch Push Migrate Deploy
Deployment Create Tag Cloud Build Hook GCR Cloud Spanner GKE
Watch Push Migrate Deploy
Deployment Migration Deployment Pipeline Cloud Spanner GKE
Deployment Migration Deployment Pipeline Cloud Spanner GKE
Deployment GKE Cloud Spanner Fetch Job Manifest ᶅ Exec `wrench
migrate` ᶄ Run Migration Job
Deployment GKE Cloud Spanner Fetch Job Manifest ᶅ Exec `wrench
migrate` ᶄ Run Migration Job
Deployment --- apiVersion: batch/v1 kind: Job metadata: name: db-migration spec:
template: spec: containers: - command: - /db/migrate.sh env: - name: SPANNER_INSTANCE_ID value: xxx - name: SPANNER_DATABASE_ID value: xxx - name: GCP_PROJECT_ID value: xxx - name: GOOGLE_APPLICATION_CREDENTIALS value: xxx image: gcr.io/xxxx…
Deployment GKE Cloud Spanner Fetch Job Manifest ᶅ Exec `wrench
migrate` ᶄ Run Migration Job
Deployment GKE Cloud Spanner Fetch Job Manifest ᶅ Exec `wrench
migrate` ᶄ Run Migration Job
Deployment wrench migrate up --directory /db
Deployment GKE Cloud Spanner Fetch Job Manifest ᶅ Exec `wrench
migrate` ᶄ Run Migration Job
Deployment Migration Deployment Pipeline Cloud Spanner GKE
Deployment Migration Deployment Pipeline Cloud Spanner GKE
Deployment GKE ᶄ Apply Deployment Manifest (Deploy New Container) ᶃ
Fetch Deployment Manifest
Deployment Create Tag Cloud Build Hook GCR Cloud Spanner GKE
Watch Push Migrate Deploy
Merpay Tech Fest 2020 https://events.merpay.com/techfest-2020