ent orm笔记2---schema使用(下)
Indexes 索引
在前两篇的文章中,其实对于索引也有一些使用, 这里来详细看一下关于索引的使用
Indexes方法可以在一个或者多个字段上设置索引,以提高数据检索的速度或者定义数据的唯一性
在下面这个例子中,对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{},
    }
}
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笔记2---schema使用(下)的更多相关文章
- ent orm笔记2---schema使用(上)
		在上一篇关于快速使用ent orm的笔记中,我们再最开始使用entc init User 创建schema,在ent orm 中的schema 其实就是数据库模型,在schema中我们可以通过Fiel ... 
- ent orm笔记1---快速尝鲜
		前几天看到消息Facebook孵化的ORM ent转为正式项目,出去好奇,简单体验了一下,使用上自己感觉比GORM好用,于是打算把官方的文档进行整理,也算是学习一下如何使用. 安装 ent orm 需 ... 
- ent orm笔记4---Code Generation
		在前面几篇文章中,我们经常使用的可能就是entc这个命令了,entc这个工具给带来了很多功能,这篇文章主要整理关于ent orm 中Code Generation 之前的例子中有个知识点少整理了,就是 ... 
- ent 基本使用 一 schema 迁移
		ent 是 facebook 开源的golang orm 框架,简单强大,以下是一个简单使用 环境准备 安装ent 工具 go get github.com/facebookincubator/ent ... 
- (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境
		Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ... 
- WPF 学习笔记-在WPF下创建托盘图标
		原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ... 
- Angular复习笔记7-路由(下)
		Angular复习笔记7-路由(下) 这是angular路由的第二篇,也是最后一篇.继续上一章的内容 路由跳转 Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另一个页面的行为.对于使 ... 
- Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法
		Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ... 
- Spark学习笔记3——RDD(下)
		目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ... 
随机推荐
- 2-Numpy之hstack、vstack、concatenate区别
			concatenate与hstack.vstack的异同点: 都表示拼接数组,concatenate可以实现hstack和vstack的功能,只需要通过调整参数axis的值即可. 其中:v表示垂直(V ... 
- C/C++编程笔记:C++入门知识丨类和对象
			本篇要学习的内容和知识结构概览 类及其实例化 类的定义 将一组对象的共同特征抽象出来, 从而形成类的概念. 类包括数据成员和成员函数, 不能在类的声明中对数据成员进行初始化 声明类 形式为: clas ... 
- [COCOS2DX-LUA]0-006.cocos2dx中关于拖动屏幕物件,同时点击home键,返回后页面变黑的问题。
			基本信息介绍: 引擎框架: Quick-Cocos2dx-Community-3.6 测试机型: 魅族MX5 问题简介: 有拖动效果的物件,在拖动的工程中,手指不放,同时点击home键退到后台. 再返 ... 
- Linux进程间通信之《共享内存》入门
			目录 简述 代码 写端代码 读取端代码 编译 运行 简述 共享内存是Linux系统进程间通信常用的方式,通常用于数据量较大的情况,如果只是用于不同的进程间消息通知,那不如用消息队列或者socket.之 ... 
- Linux文本处理详细教程
			1. 文本处理 本节将介绍Linux下使用Shell处理文本时最常用的工具: find.grep.xargs.sort.uniq.tr.cut.paste.wc.sed.awk: 提供的例子和参数都是 ... 
- cudnn加速计算
			cudnn加速运算 torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = True 第一句话是说,使用的是非确定性算 ... 
- 2020 重新出发,JAVA 学习计划
			------ @[toc]# 前言 我呢已经工作七年了,一直没有换工作,因为我这个人没什么太大的野心,安安稳稳的生活就挺好,目前的公司虽然福利一般,但是工作稳定,环境也都很熟悉了. 但是今年,到目前为 ... 
- SpringBoot进阶教程(六十三)Jasypt配置文件加密
			数据库密码直接明文写在配置中,对安全来说,是一个很大的挑战.一旦密码泄漏,将会带来很大的安全隐患.尤其在一些企业对安全性要求很高,因此我们就考虑如何对密码进行加密.本文着重介绍Jasypt对Sprin ... 
- JS学习第三天
			运算符: 赋值运算符 “=” ,将“=”右边的值赋值给左边 比较运算符 “> < >= <= == != ===”, ==比较两边内容是否一致 ... 
- C#LeetCode刷题之#404-左叶子之和(Sum of Left Leaves)
			问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4084 访问. 计算给定二叉树的所有左叶子之和. 3 / ... 
