2020年1月25日 星期六

從Java到Go系列 - Database migration tool for Go - fizz


從 Java 的世界轉換到 Go 的世界,就會開始尋找對應的服務和專案,在 Java 世界資料庫 migration 最有名的就是 liquibaseflyway ,那在 Go 的世界也有相對應的東西嗎?







目前在用的 Go Buffalo 專案,之所以喜歡它就是因為他是類似 Spring boot & JHipster 的存在,其中也包括了 database migration 的 tools - fizz ,透過它們自訂的 DSL 來描述 DB schema。根據 fizz doc 裡面有最基本的範例 (不過說實在還有些陽春),主要分為幾個部分:

1. 如何用 fizz DSL 來描述DB 動作,包含 Create table, Alter column...等。簡單範例如下

 
create_table("users") {
  t.Column("email", "string", {})
  t.Column("twitter_handle", "string", {"size": 50})
  t.Column("age", "integer", {"default": 0})
  t.Column("admin", "bool", {"default": false})
  t.Column("company_id", "uuid", {"default_raw": "uuid_generate_v1()"})
  t.Column("bio", "text", {"null": true})
  t.Column("joined_at", "timestamp", {})
}

create_table("todos") {
  t.Column("user_id", "integer", {})
  t.Column("title", "string", {"size": 100})
  t.Column("details", "text", {"null": true})
  t.ForeignKey("user_id", {"users": ["id"]}, {"on_delete": "cascade"})
}


2. 如何直接透過 fizz 執行 SQL 指令 (方便用來塞初始化資料)
3. 如何 migration & rollback db schema (透過不同檔案 *.up.fizz 和 *.down.fizz)


比起 liquibase ,希望可以增加幾個功能讓使用起來更方便:
  1. scan model 和 schema 之間的差異,自動產生 fizz 描述檔
  2. 開啟程式時自動執行 migration 和檢驗 model 與 schema 是否有正確

當然這些 tools 通常都會伴隨著綁定的 ORM 一起推出,下面也列出其他 Go database migration 工具:

不知道大家還有用過什麼更好用的工具嗎?



沒有留言 :