ent orm笔记2---schema使用(下)
2020-08-28 01:50
1386 查看
Indexes 索引
在前两篇的文章中,其实对于索引也有一些使用, 这里来详细看一下关于索引的使用
Indexes方法可以在一个或者多个字段上设置索引,以提高数据检索的速度或者定义数据的唯一性 2088
在下面这个例子中,对user表的
field1和
field2字段设置了联合索引;对
first_name和
last_name设置了联合唯一索引; 对
field3设置了唯一索引。
这里需要注意对于单独的字段设置唯一索引,在Fields中定义字段的时候通过Unique方法即可
package schema import ( "github.com/facebook/ent" "github.com/facebook/ent/schema/field" "github.com/facebook/ent/schema/index" ) // User holds the schema definition for the User entity. type User struct { ent.Schema } // Fields of the User. func (User) Fields() []ent.Field { return []ent.Field{ field.String("field1"), field.String("field2"), field.String("field3").Unique(), field.String("first_name"), field.String("last_name"), } } // Edges of the User. func (User) Edges() []ent.Edge { return nil } func Indexes() []ent.Index { return []ent.Index{ // non-unique index. index.Fields("field1", "field2"), // unique index index.Fields("first_name", "last_name").Unique(), } }
查看一下生成的表的信息:
CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `field1` varchar(255) COLLATE utf8mb4_bin NOT NULL, `field2` varchar(255) COLLATE utf8mb4_bin NOT NULL, `field3` varchar(255) COLLATE utf8mb4_bin NOT NULL, `first_name` varchar(255) COLLATE utf8mb4_bin NOT NULL, `last_name` varchar(255) COLLATE utf8mb4_bin NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `field3` (`field3`), UNIQUE KEY `user_first_name_last_name` (`first_name`,`last_name`), KEY `user_field1_field2` (`field1`,`field2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
Index On Edges
在建立表关系的时候也可以对相应的字段设置索引,主要实在特定关系下设置字段的唯一性
在这个例子中,我们有一个有许多街道的城市,我们希望在每个城市下设置街道名称是唯一的。
ent/schema/city.go
package schema import ( "github.com/facebook/ent" "github.com/facebook/ent/schema/edge" "github.com/facebook/ent/schema/field" ) // City holds the schema definition for the City entity. type City struct { ent.Schema } // Fields of the City. func (City) Fields() []ent.Field { return []ent.Field{ field.String("name"), } } // Edges of the City. func (City) Edges() []ent.Edge { return []ent.Edge{ edge.To("streets", Street.Type), } }
ent/schema/street.go
package schema import ( "github.com/facebook/ent" "github.com/facebook/ent/schema/edge" "github.com/facebook/ent/schema/field" ) // Street holds the schema definition for the Street entity. type Street struct { ent.Schema } // Fields of the Street. func (Street) Fields() []ent.Field { return []ent.Field{ field.String("name"), } } // Edges of the Street. func (Street) Edges() []ent.Edge { return []ent.Edge{ edge.From("city", City.Type). Ref("streets"). Unique(), } }
在上一篇文章中这种用法我们已经见过,我们看一下这样创建的表信息,主要是看streets这个表:
CREATE TABLE `streets` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_bin NOT NULL, `city_streets` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `streets_cities_streets` (`city_streets`), CONSTRAINT `streets_cities_streets` FOREIGN KEY (`city_streets`) REFERENCES `cities` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
在
ent/schema/street.go添加索引的信息后,再次查看streets表的信息,其实这里我们就是通过添加约束,使得一个城市中每个街道的名称是唯一的
func (Street) Indexes() []ent.Index { return []ent.Index{ index.Fields("name"). Edges("city"). Unique(), } }
CREATE TABLE `streets` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_bin NOT NULL, `city_streets` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `street_name_city_streets` (`name`,`city_streets`), KEY `streets_cities_streets` (`city_streets`), CONSTRAINT `streets_cities_streets` FOREIGN KEY (`city_streets`) REFERENCES `cities` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
Config
可以使用Table选项为类型提供自定义表名,如下所示:
package schema import ( "github.com/facebook/ent" "github.com/facebook/ent/schema/field" ) type User struct { ent.Schema } func (User) Config() ent.Config { return ent.Config{ Table: "Users", } } func (User) Fields() []ent.Field { return []ent.Field{ field.Int("age"), field.String("name"), } }
Mixin
Mixin允许您创建可重用的
ent.Schema代码。
ent.Mixin接口如下:
Mixin interface { // Fields returns a slice of fields to add to the schema. Fields() []Field // Edges returns a slice of edges to add to the schema. Edges() []Edge // Indexes returns a slice of indexes to add to the schema. Indexes() []Index // Hooks returns a slice of hooks to add to the schema. // Note that mixin hooks are executed before schema hooks. Hooks() []Hook }
Mixin的一个常见用例是将一些常用的通用字段进行内置,如下:
package schema import ( "time" "github.com/facebook/ent" "github.com/facebook/ent/schema/field" "github.com/facebook/ent/schema/mixin" ) // ------------------------------------------------- // Mixin definition // TimeMixin implements the ent.Mixin for sharing // time fields with package schemas. type TimeMixin struct{ // We embed the `mixin.Schema` to avoid // implementing the rest of the methods. mixin.Schema } func (TimeMixin) Fields() []ent.Field { return []ent.Field{ field.Time("created_at"). Immutable(). Default(time.Now), field.Time("updated_at"). Default(time.Now). UpdateDefault(time.Now), } } // DetailsMixin implements the ent.Mixin for sharing // entity details fields with package schemas. type DetailsMixin struct{ // We embed the `mixin.Schema` to avoid // implementing the rest of the methods. mixin.Schema } func (DetailsMixin) Fields() []ent.Field { return []ent.Field{ field.Int("age"). Positive(), field.String("name"). NotEmpty(), } } // ------------------------------------------------- // Schema definition // User schema mixed-in the TimeMixin and DetailsMixin fields and therefore // has 5 fields: `created_at`, `updated_at`, `age`, `name` and `nickname`. type User struct { ent.Schema } func (User) Mixin() []ent.Mixin { return []ent.Mixin{ TimeMixin{}, DetailsMixin{}, } } func (User) Fields() []ent.Field { return []ent.Field{ field.String("nickname"). Unique(), } } // Pet schema mixed-in the DetailsMixin fields and therefore // has 3 fields: `age`, `name` and `weight`. type Pet struct { ent.Schema } func (Pet) Mixin() []ent.Mixin { return []ent.Mixin{ DetailsMixin{}, } 56c } func (Pet) Fields() []ent.Field { return []ent.Field{ field.Float("weight"), } }
Builtin Mixin
Mixin提供了一些内置的
Mixin,可用于将create_time和update_time字段添加到schema中。
为了使用它们,将
mixin.Time mixin添加到schema,如下所示:
package schema import ( "github.com/facebook/ent" "github.com/facebook/ent/schema/mixin" ) type Pet struct { ent.Schema } func (Pet) Mixin() []ent.Mixin { return []ent.Mixin{ mixin.Time{}, // Or, mixin.CreateTime only for create_time // and mixin.UpdateTime only for update_time. } }
延伸阅读
相关文章推荐
- ent orm笔记1---快速尝鲜
- django学习笔记---使用orm实现用户的增删改查
- OrmLite For Android 学习笔记 之一 Ormlite 介绍及使用
- Django学习笔记:Bootstrap/FontAwesome,项目配置与使用步骤(最后),HTTP响应,jinja2,App,ORM,GET与POST传输
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
- ServiceStack.OrmLite 学习笔记7-复杂点的使用1
- 使用VC和MATCOM结合开发应用程序心得笔记
- 我的oracle笔记三(系统函数和系统包使用方面)
- daab 3.1使用笔记
- Jakarta-Common-BeanUtils使用笔记- - -
- 兔八哥笔记7:WebLogic Platform8.1使用点滴(1)
- Spring Reference 1.1第十一章-使用ORM工具进行数据访问
- 学习笔记,VB.NET使用DirectSound9 (1) 简单播放
- SQL Server的使用笔记
- ComponetArt控件使用笔记
- 使用对象-关系映射(ORM)系统中间件提升软件开发效率及质量
- UltraEdit 使用技巧笔记(转载自DBA note)
- 使用schema验证xml文档的合法性
- Windows SDK笔记(六):使用对话框资源建立窗口
- JSP学习笔记(三)-----使用JSP处理用户注册和登陆