一、建立模型目录结构
1、开发工具采用:goland
2、goland打开go-zero-my项目
3、在goland里进入终端,然后进入systemmange\rpc目录
4、执行如下命令
go run -mod=mod entgo.io/ent/cmd/ent new
参考如下图
二、定义模型
ent orm是模型优先的orm框架,首先定义角色、用户模型,这两个模型是多对多的关系。
1、定义公共模型base.go
在go-zero-my目录下创建common\orm\ent\mixins目录,然后建立base.go文件,将公共字段提取为公共的mixin,如下代码
package mixins
import (
"time"
"entgo.io/ent"
"entgo.io/ent/schema/field"
"entgo.io/ent/schema/mixin"
)
type BaseMixin struct {
mixin.Schema
}
func (BaseMixin) Fields() []ent.Field {
return []ent.Field{
field.Time("create_time").
Comment("创建时间").
Immutable().
Default(time.Now),
field.Time("update_time").
Comment("更新时间").
Default(time.Now).
UpdateDefault(time.Now),
}
}
2、定义角色、用户模型
如下代码
package schema
import (
"entgo.io/ent"
"entgo.io/ent/dialect"
"entgo.io/ent/dialect/entsql"
"entgo.io/ent/schema"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
"go-zero-my/common/orm/ent/mixins"
)
type Role struct {
ent.Schema
}
func (Role) Fields() []ent.Field {
return []ent.Field{
field.String("name").Comment("名称").
SchemaType(map[string]string{
dialect.MySQL: "varchar(32)",
}),
}
}
func (Role) Mixin() []ent.Mixin {
return []ent.Mixin{
mixins.BaseMixin{},
}
}
func (Role) Edges() []ent.Edge {
return []ent.Edge{
edge.To("users", User.Type).
StorageKey(
edge.Table("sys_role_user"),
),
}
}
func (Role) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Annotation{Table: "sys_role"},
}
}
package schema
import (
"entgo.io/ent"
"entgo.io/ent/dialect"
"entgo.io/ent/dialect/entsql"
"entgo.io/ent/schema"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
"entgo.io/ent/schema/index"
"go-zero-my/common/orm/ent/mixins"
)
type User struct {
ent.Schema
}
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("name").Comment("账号名称").
SchemaType(map[string]string{
dialect.MySQL: "varchar(32)",
}),
field.String("nick_name").Comment("账号昵称").
SchemaType(map[string]string{
dialect.MySQL: "varchar(32)",
}),
field.String("password").Comment("密码").
SchemaType(map[string]string{
dialect.MySQL: "varchar(64)",
}),
field.String("tel").Optional().Comment("手机号").
SchemaType(map[string]string{
dialect.MySQL: "varchar(32)",
}),
}
}
func (User) Mixin() []ent.Mixin {
return []ent.Mixin{
mixins.BaseMixin{},
}
}
func (User) Edges() []ent.Edge {
return []ent.Edge{
edge.From("roles", Role.Type).Ref("users"),
}
}
func (User) Indexes() []ent.Index {
return []ent.Index{
index.Fields("name").
Unique(),
}
}
func (User) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Annotation{Table: "sys_user"},
}
}
三、更新(迁移)数据库
1、在systemmange\rpc\目录执行如下命令
go run -mod=mod entgo.io/ent/cmd/ent generate ./ent/schema
2、在systemmange\rpc\目录下建立syndb.go,用于数据库迁移,注意:密码和端口
package main
import (
"context"
_ "github.com/go-sql-driver/mysql"
"go-zero-my/systemmanage/rpc/ent"
"go-zero-my/systemmanage/rpc/ent/migrate"
"log"
)
func main() {
client, err := ent.Open("mysql", "root:123456@tcp(localhost:3307)/test")
if err != nil {
log.Fatalf("failed connecting to mysql: %v", err)
}
defer client.Close()
ctx := context.Background()
// Run migration.
err = client.Schema.Create(
ctx,
migrate.WithDropIndex(true),
migrate.WithDropColumn(true),
)
if err != nil {
log.Fatalf("failed creating schema resources: %v", err)
}
}
3、在mysql里创建数据test
4、进行数据库迁移,在systemmange\rpc\目录执行如下命令
go run syndb.go
完成后,test数据库下将有三张表,如下图