gorm中的核心数据结构(3)
gorm中的核心数据结构
// 定义一个MTest的model
type MTest struct {
Id int64
Name string `gorm:"DEFAULT:John"`
}
// 定义一个model变量
var row MTest
// 未指定表,依然能从m_test表中查找到数据
err := db.Find(&row)
// 示例二
// 定义一个MTest的model
type MTest struct {
Id int64
Name string `gorm:"DEFAULT:John"`
}
// 定义一个map类型用来接收数据
var row = make(map[string]interface{},0)
// 需要指定model,才能从m_test表中查找到数据
err := db.Model(MTest{}).Find(&row)
四、Schema
type Schema struct {
Name string //model的名称
ModelType reflect.Type
Table string //表名
PrioritizedPrimaryField *Field //最优先的主键ID
DBNames []string //通过在model中指定tag(COLUMN)来和数据表中的字段关联
PrimaryFields []*Field //主键字段集合
PrimaryFieldDBNames []string //主键字段集合(数据库中的字段名)
Fields []*Field //结构体中的字段名、数据库中的字段名
FieldsByName map[string]*Field //以结构体中的字段名为key的map
FieldsByBindName map[string]*Field // embedded fields is 'Embed.Field' 嵌入的字段名称
FieldsByDBName map[string]*Field // 以数据库中的字段名为key的map
FieldsWithDefaultDBValue []*Field // fields with default value assigned by database 有默认值的字段
Relationships Relationships //相关联的表
}
在该结构体中,最核心的字段就是Fields字段。
该Fields字段就是从对应的Model结构体中通过reflect解析出来的字段。该字段默认是跟数据表中的字段一一对应的。
五、Clause
在sql语句中,各个关键词对应的就是从句,即Clause。
比如Select、From、Where、Order、Group By、Limit等等。
在gorm中,会通过对应名称的函数来组织对应的从句。比如Where从句:
// 组织成Where从句
func (db *DB) Where(query interface{}, args ...interface{}) (tx *DB)
// 组织成GroupBy从句
func (db *DB) Group(name string) (tx *DB)
比如以下就是指定了Where的从句:
type MTest struct {
Id int64
Name string `gorm:"DEFAULT:John"`
}
var row MTest
err := db.Where("id=?", 1).Find(&row)
在gorm中,将各个从句定义成了对应的类型。
同时,这些类型又实现了Clause接口类型。
如下是Clause接口的定义:
// Interface clause interface
type Interface interface {
Name() string
Build(Builder)
MergeClause(*Clause)
}
在这个接口中,有一个Build函数需要额外注意。
各个具体的从句就是通过Build这个函数来转换成对应的sql语句的。比如Where从句:
// Build build where clause
func (where Where) Build(builder Builder) {
// Switch position if the first query expression is a single Or condition
for idx, expr := range where.Exprs {
if v, ok := expr.(OrConditions); !ok || len(v.Exprs) > 1 {
if idx != 0 {
where.Exprs[0], where.Exprs[idx] = where.Exprs[idx], where.Exprs[0]
}
break
}
}
buildExprs(where.Exprs, builder, AndWithSpace)
}
相关阅读
-
Java基础之编程语言和Java简介
小编为网友们解答Java基础之编程语言和Java简介的相关话题,接下来IT袋网小编就来介绍。 编程语言是计算机能够理解和识别用户操作意图的一种高级语言。 它包括一系列符号、关键字和语法
-
帝国cms万能标签 帝国cms灵动标签调用指定栏目或分类下的文章
帝国cms怎么调用指定栏目或分类下的文章? 下面itmemoIT袋小编就给大家分享帝国cms灵动标签调用指定栏目标题,简介...等信息的代码! [e:loop={10,6,0,0}] li a href=?=$bqsr[titleurl]? class=news-zuixin-picim
-
电脑浏览国外网站用什么加速器 不收费的外网加速器介绍
关于这方面的知识你知道吗?电脑浏览国外网站用什么加速器和不收费的外网加速器介绍方面的内容,下面IT袋为您详细介绍 说在前面 GitHub作为国外网站,有时候经常访问不上去,那么,Git
-
2023年的顶尖IDPS解决方案
本文为您带来的是2023年的顶尖IDPS解决方案的相关介绍,接下来就是全面介绍。 以下是一些2023年的顶尖IDPS解决方案,它们代表了各种类型的IDPS技术。 1. Cisco Secure Next-Generation IPS Cisco Secure NG


