gorm中的核心数据结构(2)
gorm中的核心数据结构
三、Statement
statement代表的是语句,这里就包含了sql种涉及到的所有语句了。其结构如下:
type Statement struct {
*DB
TableExpr *clause.Expr //表表达式
Table string //表名
Model interface{} //model结构体
Dest interface{} // 接收查询结果的变量
ReflectValue reflect.Value //model类型的value值
Clauses map[string]clause.Clause //sql语句
BuildClauses []string
Distinct bool //是否去重
Selects []string // 要查询的字段列表
Omits []string // 忽略的字段
Joins []join // join的表
Preloads map[string][]interface{}
Settings sync.Map
ConnPool ConnPool
Schema *schema.Schema // 对应的表的模式
Context context.Context
SQL strings.Builder //最终编译好的sql语句
Vars []interface{} // 从句中涉及到的变量值
}
这里只列出了一些关键的字段。我们分类讲解一些这些关键字段。
表相关字段
TableExpr和Table:这两个字段都是通过DB.Table(name string, args …interface{})函数指定的。
比如我们常用的DB.Table(“m_test”)就可以指定要查询的表名。
Model和Schema字段
通过model字段可以指定和数据表对应的结构体类型。
然后gorm再通过model结构体转换成对应的表的建表模式,并将其复制到Schema字段中。
Dest字段
Dest字段用来接收从数据表中查询的结果。
我们看Dest的类型是interface{},也就是说可以是任意类型。
Dest一般是通过Find函数、Save、Create等函数传进来的。如下各函数的原型:
// dest会复制给Dest字段
func (db *DB) Find(dest interface{}, conds ...interface{}) (tx *DB)
// 会将value参数赋值给Dest字段
func (db *DB) Save(value interface{}) (tx *DB)
// 会将value参数赋值给Dest字段
func (db *DB) Create(value interface{}) (tx *DB)
同时,这里还会有一个特点,就是当Model字段为nil时,会将Dest字段赋值给Model字段。
这也就是为什么我们在使用gorm的时候,给Find函数传一个Model类型的dest就能定位到对应的表,并将数据获取出来。
而给Find函数传递一个map类型的dest,就必须要通过Table函数指定一个表名的原因。如下:
相关阅读
-
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


