Slide 1

Slide 1 text

spansql で ENUM を使いたかった話 Asakusa.go #4 2024.11.08

Slide 2

Slide 2 text

自己紹介 Sugar Sato (@satoIsSugar) ● 2023年 BuySell Technologies入社 ● 基盤チーム所属(Portal/Account/Approval) PjM ○ アソシエイトマネージャー ● Go / Angular / Serverless ○ Go歴: Go 年目くらい ● 熱帯植物 ○ ビカクシダ ● 猫 ○ Lambda (♀ 2才)

Slide 3

Slide 3 text

プロダクト群「バイセルリユースプラットフォーム Cosmos」の開発が進行中 リユースに必要なすべての機能を提供する 「リユースプラットフォーム Cosmos」の開発が進行中です。 Cosmosを活用して、バイセルグループ全体での業務効率改善やデータドリブン経営の深化を目指しています。 リユースプラットフォーム Cosmos 自社開発のリユース特化業務基幹システムでありサービス群の集合体 買取申込 買取・査定 在庫管理 販売 多様なチャネルで収益最大化 CRM -顧客対応- 買取種別に応じた最適なシステム構築 Visit -訪問買取 - Store -店舗買取 - Promas -商材マスタ - Appraisal -専門査定 - Stock -在庫管理 - EXS -販売管理 - Core -会員管理- Portal -データ利用- Pocket -データ基盤- 買取 専門チームによる真贋・査定と連携 査定 申込 効率的な顧客対応 在庫 在庫管理の最適・効率化 販売 データ 各事業プロセスにある データを一元管理 :基幹システム

Slide 4

Slide 4 text

アジェンダ ENUM を適用してみる 01 spansql を読んでみた 02 まとめ 04 後日談 03

Slide 5

Slide 5 text

ENUM を適用してみる

Slide 6

Slide 6 text

● CloudSpanner 導入 ● wrench をマイグレーションツールとして使用 ● ENUM をつかってカラムに制約を持たせたい ○ 参考: ENUM の生成方法 ENUM を使いたかった背景

Slide 7

Slide 7 text

ENUM を使いたかった背景 ● 手順 ○ proto ファイル定義 ○ pb ファイル生成 ○ gcloud コマンドで流し込み (DDL + proto ファイル) ● くわしいことは CloudSpannerでENUMを使う方法 を参照

Slide 8

Slide 8 text

準備は整ったので マイグレーション実行!

Slide 9

Slide 9 text

ズコーーーーー !!

Slide 10

Slide 10 text

● エラー箇所 ○ wrench/pkg/spanner/migration.go ■ LoadMigrations → ddlToStatements ● ※マイグレーションに頼らず手動で SQL を実行することはできる failed to parse DDL/DML statements

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

spansql.ParseDDL でこけてる ... spansql ってなんだ?

Slide 13

Slide 13 text

spansql を読んでみた

Slide 14

Slide 14 text

コードを読む前に spansql の概要から

Slide 15

Slide 15 text

● 公式ライブラリ (google-cloud-go) ● > spansql is reusable for anything that interacts with Cloud Spanner on a syntactic basis, such as tools for handling Spanner schema (DDL). ○ google-cloud-go/spanner/spannertest /README.md ● リリース予定日遅れがち spansql とは

Slide 16

Slide 16 text

spansql とは ● 「spannertest のおまけとして世に出ることになった」ものらしい ○ > Neither of these packages aims to be performant nor exact replicas of the production Cloud Spanner. ○ > They are reasonable for building tools, or writing unit or integration tests. ■ google-cloud-go/spanner/spannertest /README.md

Slide 17

Slide 17 text

そしたら マイグレーション処理の流れをみていく

Slide 18

Slide 18 text

対象とするクエリは下記 CREATE TABLE

Slide 19

Slide 19 text

マイグレーションの全体像

Slide 20

Slide 20 text

マイグレーションの全体像

Slide 21

Slide 21 text

ParseDDL ~ parseCreateTable

Slide 22

Slide 22 text

ParseDDL ~ parseCreateTable

Slide 23

Slide 23 text

マイグレーションの全体像

Slide 24

Slide 24 text

parseCommaList ~ parseColumnDef

Slide 25

Slide 25 text

マイグレーションの全体像

Slide 26

Slide 26 text

parseType ~ parseBaseOrParameterizedType

Slide 27

Slide 27 text

ところで結局 spansql 以外を使って ENUM 適用したの?

Slide 28

Slide 28 text

残念ながら見送った

Slide 29

Slide 29 text

● アプリケーション内でチェックをする ● SQL 文に CHECK 制約を使う ENUM を使わない場合

Slide 30

Slide 30 text

ENUM は使えなかったけど とりあえず CHECK 制約で回避 🙌

Slide 31

Slide 31 text

後日談

Slide 32

Slide 32 text

後日談 ● この資料を作ったタイミングで ENUM が使えるように ... ○ spanner/spansql: support for Protobuf column-types ○ ENUM を使えるようにするPR ○ v1.72.0 のリリース待ち ● ただソースコード読んだだけになってしまった...w ○ でも楽しかったのでOKです

Slide 33

Slide 33 text

まとめ

Slide 34

Slide 34 text

まとめ ● spansql で ENUM が使えるようになっていた ● wrench で詰まったら spansql のコード見ると良さそう ● spansql のリリース頻度が体感で若干遅い ● spansql に対応していないクエリがある(あった) ○ ChangeStreams ○ (対応済み) CREATE PROTO BUNDLE ○ (対応済み) ENUM

Slide 35

Slide 35 text

「spansql で ENUM を使いたかった話」 「spansql で ENUM を使えるようになってた話」

Slide 36

Slide 36 text

Thank you

Slide 37

Slide 37 text

引用 ● https://github.com/cloudspannerecosystem/wrench ● https://cloud.google.com/spanner/docs/reference/standard-sql/protocol-buffers#create_a_protocol_buffer ● https://qiita.com/sgash708/items/6813a68eb91e92ca2227 ● https://github.com/googleapis/google-cloud-go/tree/f847c75df3bda9d74257ab68e55ac01191c287fc/spanner ● https://github.com/cloudspannerecosystem/wrench ● https://x.com/apstndb/status/1833864450287554840 ● https://github.com/googleapis/google-cloud-go/issues/10944 ● https://github.com/googleapis/google-cloud-go/pull/10945 ● https://github.com/googleapis/google-cloud-go/pull/11088 ● https://github.com/cloudspannerecosystem/wrench/blob/3a330a06ffd2149a5bf5143d582b5c637554575d/pkg/spanner/migration.go# L120 ● https://x.com/apstndb/status/1833864450287554840 ● https://github.com/googleapis/google-cloud-go/blob/main/spanner/spannertest/README.md ● https://pkg.go.dev/cloud.google.com/go