ent orm笔记2---schema使用(下)

四、 Marshmallow Schemas 介绍 (Flask开发应用) 是一个用于序列化和反序列化复杂数据类型(例如对象)到 Python 原生数据类型(如字典、列表)的库,同时它也提供数据验证功能。在许多 Flask 项目中,Marshmallow 常用于处理 JSON 请求和响应数据的验证和格式化。marshmallow是一个用来将复杂的orm对象与python原生数据类型之间相互转换的库,简而言之,就是实现:marshmallow在反序列化(dict/str/list->object)的时候,可以进行数据字段的校验。 阅读详情

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.
    }
}

延伸阅读

  • https://entgo.io/

常用校验注解@NotEmpty,@NotBlank,@NotNull,@Valid,@Validated用法区别,以及搭配 BindingResult使用,嵌套验证等《使用|优快云创作打卡》 文章目录一、常用注解@NotEmpty,@NotBlank,@NotNull介绍二、@Valid与@Validated的使用与区别2.1@Valid与@Validated区别:2.2嵌套验证三、总结 一、常用注解@NotEmpty,@NotBlank,@NotNull介绍 包位置:javax.validation.constraints.xxx @NotEmpty 用在集合上面,一般用来校验List类型(不能注释枚举),而且长度必须大于0 @NotBlank 用在String上面,一般用来校验Stri 阅读详情

相关推荐

全面揭秘 Go 语言超强 ORM 框架 Ent:高效构建数据库的终极武器!

全面揭秘 Go 语言超强 ORM 框架 Ent:高效构建数据库的终极武器!

jsjbrdzhh的博客 3083

ORM常见问题

orm, xorm, gorm, gomrt,

zhw21w的博客 1453

【golang-ent】go-zero框架 整合 ent orm框架实现一对一 一对多 多种姿势查询方式

【golang-ent】go-zero框架 整合 ent orm框架实现一对一 一对多 多种姿势查询方式

CTRA®王大大技术中心 873

搞懂常见Go ORM系列-Ent框架详解

Ent 是一个用于 Go 语言的 ORM(对象关系映射)框架它的最大特点是通过代码生成的方式,提供类型安全的数据库访问能力在使用 Ent 时,首先需要定义 schema,然后通过工具生成数据库访问代码,这样不仅提高了开发效率,还能避免常见的运行时错误Ent 支持多种关系型数据库,包括 MySQL、PostgreSQL、SQLite 和 Microsoft SQL Server,并且对数据库结构和关系的支持非常全面在使用 Ent 时,开发者需要先定义 schema,这是 Ent 中模型的基础。

2401_89221445的博客 2279

Windows Server 2008 R2装不上VMware Tools?别急,手动安装驱动补丁的保姆级教程来了

本文提供了Windows Server 2008 R2手动安装VMware Tools驱动补丁的详细教程,解决驱动签名验证失败问题。通过获取特定补丁文件、创建安装介质、挂载虚拟机并安装补丁等步骤,帮助用户顺利完成VMware Tools安装,提升虚拟机功能与性能。

weixin_28335283的博客 467

一文读懂 AI 模型训练流程

AI模型训练流程可分为五个关键步骤:首先进行数据准备,包括收集、清洗、标注和增强数据;其次选择合适的模型架构并搭建神经网络;然后通过前向传播、损失计算和反向传播进行模型训练;接着用验证集评估模型性能,并调整超参数;最后在测试集上检验模型泛化能力。整个过程需要精心设计每个环节,才能获得性能优异的AI模型。

牧晨加油站 1480

XML学习之Xml Schema:七、派生复杂类型--扩展

当从简单类型或具有简单内容的复杂类型派生复杂类型时(注意:简单内容直接或间接派生出来的复杂类型也必须是简单内容,简单内容不能派生复杂内容),使用xs:simpleContent元素,如果是扩展派生,使用xs:extension元素,如果是限制派生,使用xs:restriction元素。         扩展派生         通过扩展派生的复杂类型,他的有效内容模型是基类型的内容模型加上扩展

tuolingss的专栏 3354

基于STM32的超声波流量计设计

本项目基于STM32微控制器设计了一种超声波流量计,采用时间差法测量液体或气体的流速,计算流量并通过显示屏实时显示,同时支持远程数据传输。本设计通过STM32微控制器实现了基于时间差法的超声波流量计,集成了超声波信号采集、流量计算、状态显示和远程通信功能。本系统需要实现超声波信号的实时采集与处理,计算流速和流量,并将数据通过OLED显示和无线模块上传。系统需具备高精度的时间测量能力和良好的抗干扰能力。通过计算超声波在顺流和逆流方向上的传播时间差,结合管道直径与流体特性,计算流速并进一步计算流量。

stm32d1219的博客 2347

ent orm笔记2---schema使用(上)

在上一篇关于快速使用ent orm的笔记中,我们在最开始使用entc init User 创建schema,在ent orm 中的schema 其实就是数据库模型,在schema中我们可...

后场技术 1659

别再只跑memtester了!嵌入式Linux内存压力测试,这5个参数和场景你试过吗?

本文深入探讨了嵌入式Linux内存压力测试的高级技巧,重点解析了memtester工具的5个关键参数和实战场景。通过物理地址测试、迭代控制、内存分配策略等调优方法,帮助开发者有效检测内存稳定性问题,适用于长期运行设备、特定故障重现等复杂场景,提升嵌入式系统可靠性。

weixin_30838873的博客 424

DCDC--控制方式(Control Mode)

DCDC反馈控制方式

网始如芯个人博客 1万+

Golang-Ent ORM框架

面向对象编程和关系型数据库,都是目前最流行的技术,但是它们的模型是不一样的。面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。ORM 把数据库映射成对象。

Ch3nnn的博客 2932

手把手教你学GPU的KMD专栏--3.4 中断处理机制与优化

记住,中断处理是GPU与CPU通信的"桥梁",没有高效的中断处理,GPU的性能将无法充分发挥。KMD通过"快进快出"原则、事件标志机制、GPU本机围栏等技术,实现高效、低延迟的中断处理。:GPU本机围栏机制允许GPU在满足特定条件(如围栏值达到某个阈值)时才触发中断,而不是每次围栏更新都触发中断,从而显著减少CPU唤醒次数,降低功耗。正如Microsoft GPU架构师在2022年WinHEC大会上指出:"没有好的中断处理,再强大的GPU也会被系统延迟拖垮。:多个GPU设备共享中断,导致中断处理混乱。

MHD0815的博客 112

go语言ORM框架ent使用教程

ent是什么 ent是一个简单而又功能强大的Go语言实体框架,ent易于构建和维护应用程序与大数据模型。 简而言之,ent是一款便于操作的orm框架 installation go get entgo.io/ent/cmd/ent 使用 创建schema 在连接ent之前,我们首先需要创建schema,创建schema的作用类似django创建model,规定数据表字段,定义表名等 cli创建model模板命令 ent init --target <target dirpath> <Mod

爱吃回锅肉的胖子 1万+

Centos 7 Linux 离线安装使用 MySQL 5.7:下载、安装、配置、使用

本文详细介绍了在 CentOS 7 系统下离线安装 MySQL 5.7 的完整流程,包括环境准备、安装包下载、用户与目录配置、数据库初始化、服务启动与自启设置、root 密码修改、远程访问开启及防火墙配置等关键步骤,并提供了本地与远程客户端(如 Navicat、DBeaver)的连接使用方法,适合无网络环境下的数据库部署参考。

寒水馨 · 轻量级技术文档 · hanshuixin.org 6111

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Golang微服框架Kratos与它的小伙伴系列 - ORM框架 - Ent

Golang ORM框架Ent简介 Ent是Facebook开源的一款Go语言ORM框架,通过代码生成实现数据库操作。它将数据库表映射为Schema(类),记录为对象,字段为属性,使开发者能够使用面向对象语法操作关系型数据库。 Ent核心特点: 基于代码生成实现静态类型安全 支持多种数据库(MySQL/PostgreSQL/SQLite/Gremlin) 提供Schema定义和CRUD API 可通过Mixin复用公共字段 Ent工具链包括: entc命令行工具:用于生成数据库操作代码 Schema定义:描

喵个咪的专栏 1107

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ent4/ent比较分析:与其他ORM框架的优劣对比

在现代软件开发中,对象关系映射(ORM,Object-Relational Mapping)框架扮演着至关重要的角色,它能够简化数据访问层的开发,提高开发效率,同时减少手动编写SQL的错误。ent4/ent作为Go语言生态中一款新兴的ORM框架,以其独特的设计理念和强大的功能受到了广泛关注。本文将从多个维度对ent4/ent与其他主流ORM框架进行深入比较,分析其优势与不足,帮助开发者做出更合适的...

gitblog_00345的博客 462

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Go Ent 简介

Go Ent 简介

闲余知道 1482

go ent框架使用

一、前提提要 1、ent框架:是一个操控数据库的orm框架,类似python中的sqlalchemy来操作数据库 2、据说非常适合处理各种复杂关系(我也不知道是真是假,不过好用是真的) 3、安装:go get entgo.io/ent/cmd/entc 4、引用别人的一个概念: (1)Schema:描述一个实体的定义以及他与其他实体的关系,类似python里用sqlalchemy创建的modul,就是数据表的一个描述 (2)Edges:实体与实体之间的关系称为edge 4、常用命令: 创建一

weixin_48609908的博客 4732

Golang ORM ent

ent 是一个简单而又强大的Go实体框架 简单地使用数据库结构作为图结构。 使用Go代码定义结构 基于代码生成的静态类型 容易地进行数据库查询和图遍历 容易地使用Go模板扩展和自定义 应用场景 ent非常适合处理各种复杂的关系,定义好实体和实体之间的关系,就可以快速得到各种想要的数据 核心概念 Schema: 描述一个实体的定义以及他与其他实体的关系 Edges:实体与实体之间的关系称为边 ===>edge 使用步骤 安装 go get entgo.io/ent/cmd/ent 创

qq_39297673的博客 1106

终极ent迁移指南:从其他ORM快速切换到ent的完整步骤

ent是Go语言中简单而强大的实体框架,让构建和维护大型数据模型的应用变得轻松。如果你正在使用其他ORM(如GORM、sqlx或标准库database/sql),本文将为你提供从其他ORM迁移到ent的完整指南。 ## 为什么要从其他ORM迁移到ent? 🚀 ent提供了许多其他ORM不具备的优势: - **代码即架构** - 将任何数据库架构建模为Go对象 - **轻松遍历任何图形**

gitblog_00904的博客 639

超强ent4/ent框架:代码生成驱动的静态类型ORM新范式

你还在为手写SQL、处理复杂数据关系而烦恼吗?ent4/ent框架通过代码生成和静态类型检查,让数据访问层开发效率提升10倍!本文将带你快速掌握这一革命性ORM工具的核心优势、5分钟上手流程及实战技巧,让你彻底告别重复劳动,专注业务逻辑开发。 ## 核心特性一览 ent4/ent作为Go语言生态中领先的ORM框架,凭借代码生成驱动和静态类型安全两大核心优势,彻底改变了传统ORM的开发模式。以下...

gitblog_00215的博客 703

Flash-Attention的PyTorch与CUDA版本兼容修复:从安装OOM到稳定跑通

凌晨一点,你执行 `pip install flash-attn --no-build-isolation`,进度条卡在 68%,终端滚出 `nvcc fatal: out of memory`,而下午刚升级过的 torch 又让旧装的 flash-attn 抛 `undefined symbol`。这两个报错背后是同一条依赖链:flash-attn、PyTorch、CUDA 工具链、GPU 架构

gitblog_01153的博客 551

ent 框架研究报告

• ent/generate.go 使用 go run -mod=mod entgo.io/ent/cmd/ent generate ./schema,符合。• ent/schema/shop.go 使用 uid、title、price、stock;• 本地项目文件:go.mod、ent/generate.go、ent/schema、internal/database/mysql.go、• ent 官方 Transactions 文档:https://entgo.io/docs/transactions/

zffggkhzjdt的博客 177

Ent框架实战:从表结构到订单增删改查

服务端口、MySQL 连接池、Redis 连接池、登录 token 有效期、Nacos 参数都统一放在 common/config/config.yaml,并由 common/config/config.go 接收。写一个表时,通常先在 ent/schema 下创建对应文件,再在 Fields 方法里写字段、类型、约束、默认值和备注。生成文件主要被调用,不写业务;main.go 启动后先调用 appinit.Init(ctx),这个函数把配置读取、MySQL 连接、Ent 迁移、Redis 连接串起来。

2603_95046224的博客 358
上一篇: ent orm笔记2---schema使用(上)
下一篇: ent orm笔记4---Code Generation
后场技术
博客等级 码龄11年 156粉丝 46原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值