go培训课程都学什么?xorm框架学习系列(二):xorm结构体映射规则和表操作

   2023-02-09 学习力0
核心提示:上节内容我们学习了基本的xorm框架的知识和基础配置的相关信息。本节课内容我们继续学习相关的知识和相关操作。名称映射规则名称映射规则主要负责结构体名称到表名和结构体field到表字段的名称映射。 在xorm框架中由core.IMapper接口的实现者来管理,xorm内置

上节内容我们学习了基本的xorm框架的知识和基础配置的相关信息。本节课内容我们继续学习相关的知识和相关操作。

名称映射规则

名称映射规则主要负责结构体名称到表名和结构体field到表字段的名称映射。 在xorm框架中由core.IMapper接口的实现者来管理,xorm内置了三种IMapper实现:core.SnakeMapper,core.SameMappercore.GonicMapper

  • SnakeMapper:支持struct为驼峰式命名,表结构中为下划线命名之间的转换。该种规则为xorm默认的Maper;

  • SameMapper:映射规则支持结构体名称和对应的表名称以及结构体field名称与对应的表字段名称相同的命名;

  • GonicMapper:该映射规则和驼峰式命名类似,但是对于特定词支持性更好,比如ID将会翻译成id,而不是驼峰式的i_d。

默认的名称映射规则为SnakeMapper,如果开发者需要改变时,可以使用创建的数据库引擎对象进行如下设置:

engine.SetMapper(core.SameMapper{})

另外,可以设置表名和表字段分别为不同的映射规则:

engine.SetTableMapper(core.SameMapper{})
engine.SetColumnMapper(core.SnakeMapper{})

使用Tag的映射规则

如果所有的命名都是按照IMapper的映射来操作的,那当然是最理想的。但是如果碰到某个表名或者某个字段名跟映射规则不匹配时,我们就需要别的机制来改变。 xorm提供了如下几种方式来进行:

  • 如果结构体拥有TableName() string的成员方法,那么此方法的返回值即是该结构体对应的数据库表名。

  • 通过engine.Table()方法可以改变struct对应的数据库表的名称,通过sturct中field对应的Tag中使用xorm:"'column_name'"可以使该field对应的Column名称为指定名称。这里使用两个单引号将Column名称括起来是为了防止名称冲突,因为我们在Tag中还可以对这个Column进行更多的定义。如果名称不冲突的情况,单引号也可以不使用。

Column属性定义

我们在field对应的Tag中对Column的一些属性进行定义,用于对我们的项目中的数据库表字段进行设置和限定。定义的方法基本和我们写SQL定义表结构类似。如下所示:

type User struct {
  Id   int64
  Name string `xorm:"varchar(25) notnull unique 'usr_name'"`
}

xorm中对数据类型有自己的定义,具体的Tag规则如下,另Tag中的关键字均不区分大小写:

name 当前field对应的字段的名称
pk 是否是Primary Key
name 当前field对应的字段的名称
pk 是否是Primary Key
autoincr 是否是自增
[not ]null 或 notnull 是否可以为空
unique 是否是唯一
index 是否是索引

| extends | 应用于一个匿名成员结构体或者非匿名成员结构体之上 | - | 这个Field将不进行字段映射 | | -> | Field将只写入到数据库而不从数据库读取 | | <- | Field将只从数据库读取,而不写入到数据库 | | created | Field将在Insert时自动赋值为当前时间 | | updated | Field将在Insert或Update时自动赋值为当前时间 | |deleted | Field将在Delete时设置为当前时间,并且当前记录不删除 | | version | Field将会在insert时默认为1,每次更新自动加1 | | default 0或default(0) | 设置默认值,紧跟的内容如果是Varchar等需要加上单引号 | | json | 表示内容将先转成Json格式 |

字段映射规则

除了上述表名的映射规则和使用Tag对字段进行设置以外,基础的Go语言结构体数据类型也会对应到数据库表中的字段中,具体的一些数据类型对应规则如下:

Go语言数据类型 xorm 中的类型
implemented Conversion Text
int, int8, int16, int32, uint, uint8, uint16, uint32 Int
int64, uint64 BigInt
float32 Float
float64 Double
complex64, complex128 Varchar(64)
[]uint8 Blob
array, slice, map except []uint8 Text
bool Bool
string Varchar(255)
time.Time DateTime
cascade struct BigInt
struct Text
Others Text

表基本操作

  • 创建表:CreateTables(),参数为一个或多个空的对应Struct的指针。

  • 判断表是否为空:IsTableEmpty()

  • 判断表是否存在:IsTableExist()

  • 删除表:DropTables(),参数为一个或多个空的对应Struct的指针或者表的名字。

基本和统计操作

查询和统计主要使用Get, Find, Count, Rows, Iterate这几个方法,以及条件查询Where。

具体的编程使用方法我们在视频和程序中会给大家详细使用,这是我们实战项目的重点内容。

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • intellij idea go go go!
    安装如下:1. intellij idea2. jdk-8u31-windows-x643.1. scala:Scala是一门多范式的编程语言,一种类似java的编程语言[1]  ,设计初衷是实现可伸缩的语言[2]  、并集成面向对象编程和函数式编程的各种特性。 2.IdeaVimEmulates Vim editorVim是一个类似
    03-08
  • 用 VSCode 搭建 Go 语言开发环境
    用 VSCode 搭建 Go 语言开发环境
    介绍这是来自 Funai Research Institute Digital 的 osw。由于我决定使用 Go 语言进行工作,所以我会在学习时将其记录在备忘录中。如果您可以参考,我将不胜感激。目标听众从现在开始学习 Go 语言的人我正在考虑使用 VSCode本次使用的环境这次,我们将基于以
    03-08
  • Go语言使用goroutine及通道实现并发详解
    Go语言使用goroutine及通道实现并发详解
    目录使用通道接收数据阻塞接收数据非阻塞接收数据接收任意数据,忽略掉接收的数据循环接收数据使用通道接收数据在上一篇文章中介绍了通道以及使用通道发送数据,本篇接着了解通道的基本内容,如何使用通道接收数据;通道的接收同样使用"-"操作符;使用通道接
  • Go 数据结构之堆排序示例详解
    Go 数据结构之堆排序示例详解
    目录堆排序堆排序过程动画显示开始堆排序代码实现总结堆排序堆排序是一种树形选择排序算法。简单选择排序算法每次选择一个关键字最小的记录需要 O(n) 的时间,而堆排序选择一个关键字最小的记录需要 O(nlogn)的时间。堆可以看作一棵完全二叉树的顺序存储结构
  • Go语言数据结构之希尔排序示例详解 go语言堆排序
    Go语言数据结构之希尔排序示例详解 go语言堆排
    目录希尔排序算法思想图解算法Go 代码实现:总结希尔排序在插入排序中,在待排序序列的记录个数比较少,而且基本有序,则排序的效率较高。1959 年,Donald Shell 从“减少记录个数” 和 “基本有序” 两个方面对直接插入排序进行了改进,提出了希尔排序
  • 【每天自动更新】Go增强月-分享你的开发必备知识-LGTM排行榜!
    【每天自动更新】Go增强月-分享你的开发必备知
    这篇文章是“Go增强月——让我们分享你需要知道的发展知识——”本文支持主题。我们将使用 Qiita API v2 来收集似乎在参与“Go 增强月-让我们分享您需要了解的开发知识-”的文章。我将在收集的文章组(数据)上尝试这个和那个。按 LGTM 编号对文章进行排序投
  • Go REFLECT Library反射类型详解
    Go REFLECT Library反射类型详解
    目录一、反射概述二、反射类型对象基本数类型的 反射类型对象引用数据类型的 反射类型对象结构体的 反射类型对象指针的 反射类型对象一、反射概述反射是指程序在运行期间对程序本身进行访问和修改的能力。程序在编译过程中变量会被转换为内存地址,变量名不会
  • Go-ethereum 解析ethersjs中产生的签名信息思路详解
    Go-ethereum 解析ethersjs中产生的签名信息思
    目录Go-ethereum 解析ethersjs中产生的签名信息1. ethers 消息签名1.1 ethers 对签名消息进行解析2. Golang 签名解析3. 总结Go-ethereum 解析ethersjs中产生的签名信息在签名验证的过程中,我们判断签名正确的前提是,签名解析后的公钥,和发起这次动作的人是
  • go并发编程sync.Cond使用场景及实现原理
    目录使用场景实现原理copyCheckerWaitSignalBroadcast使用场景sync.Cond是go标准库提供的一个条件变量,用于控制一组goroutine在满足特定条件下被唤醒。sync.Cond常用于一组goroutine等待,一个goroutine通知(事件发生)的场景。如果只有一个goroutine等待,
  • go 熔断原理分析与源码解读
    go 熔断原理分析与源码解读
    目录正文熔断原理熔断器实现hystrixBreaker和googlebreaker对比源码解读结束语正文熔断机制(Circuit Breaker)指的是在股票市场的交易时间中,当价格的波动幅度达到某一个限定的目标(熔断点)时,对其暂停交易一段时间的机制。此机制如同保险丝在电流过大时
点击排行