天天看点

go-zero 实践 - 定义模型(二)

作者:IT技术帮

一、建立模型目录结构

1、开发工具采用:goland

2、goland打开go-zero-my项目

3、在goland里进入终端,然后进入systemmange\rpc目录

4、执行如下命令

go run -mod=mod entgo.io/ent/cmd/ent new           

参考如下图

go-zero 实践 - 定义模型(二)

二、定义模型

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),
	}
}           
go-zero 实践 - 定义模型(二)

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数据库下将有三张表,如下图

go-zero 实践 - 定义模型(二)

继续阅读