《甘十九妹》 ent 实现之 Migrate

上回我们定义了江湖里三个重要的元素:门派、江湖儿女及武功,我不会告诉你武功是我后来偷偷练的。

这次我们要用笔(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{}),

至此,江湖三要素:门派、江湖儿女、武功构建完成。

ent
本作品采用《CC 协议》,转载必须注明作者和本文链接
折扇轻合书已竟,入戏太深我共卿。
讨论数量: 1

文艺青年

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!