《甘十九妹》 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{}),
至此,江湖三要素:门派、江湖儿女、武功构建完成。
本作品采用《CC 协议》,转载必须注明作者和本文链接
文艺青年