《甘十九妹》 ent 實現之 Migrate

碧落暉發表於2020-03-29

上回我們定義了江湖裡三個重要的元素:門派、江湖兒女及武功,我不會告訴你武功是我後來偷偷練的。

這次我們要用筆(ent)把它們(表)畫出來(建立到資料庫)。為了儘量使目錄結構看起來規範,我建立了 cmd/migrate 目錄,並建立了 migrate.go

mkdir -pv cmd/migrate && cd $_
touch migrate.go

要建立到資料庫,我們首先要實現連線到資料庫的 Client,這裡要用到上回裡生成的 ent/client.go ,我們稍稍弄得複雜點,使其與 Golang 原生的 sql.DB 結合起來並加上連線池的配置。

package main

import (
    "database/sql"
    "github.com/BiLuoHui/ganshijiumei/ent"
    ents "github.com/facebookincubator/ent/dialect/sql"
    _ "github.com/lib/pq"
    "log"
    "time"
)

const (
    dsn             = "host=127.0.0.1 port=5432 user=hui password= dbname=hui sslmode=disable"
    maxIdleConns    = 6
    maxOpenConns    = 100
    connMaxLifetime = time.Hour * 2
)

var client *ent.Client

func main() {
    log.Println(client)
    defer client.Close()
}

func init() {
    db, err := sql.Open("postgres", dsn)
    if err != nil {
        log.Fatalln(err)
    }

    db.SetMaxIdleConns(maxIdleConns)
    db.SetMaxOpenConns(maxOpenConns)
    db.SetConnMaxLifetime(connMaxLifetime)
    drv := ents.OpenDB("postgres", db)

    client = ent.NewClient(ent.Driver(drv))
}

為了不使文章變得複雜,將配置放在常量裡,並使用 init 函式來初始化 client ,工作中請勿使用此不良操作。

我們建立一個 migrate 函式來實現 migrate 功能,它在出錯時直接列印錯誤並退出。

func main() {
    migrate(context.Background())

    defer client.Close()
}

func migrate(ctx context.Context) {
    if err := client.Schema.Create(ctx); err != nil {
        log.Fatalf("failed creating schema resources: %v\n", err)
    }
}

然後在 cmd/migrate 目錄下執行 go build 來生可執行檔案 migrate,最後我們執行它 ./migrate。讓我們來看看建立好後的表結構:

我們看到表的自增主鍵 ent 自動幫我們加上了,如果你使用 UUID 來做主鍵,只需要在 Schema 欄位定義中加上:

 field.UUID("id", uuid.UUID{}),

至此,江湖三要素:門派、江湖兒女、武功構建完成。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

摺扇輕合書已竟,入戲太深我共卿。

相關文章