IT袋

当前位置:主页 > 经验教程 > 建站编程 >

gorm中的核心数据结构

gorm中的核心数据结构(2)

时间:2023-11-02 21:47:38 来源:IT袋 作者:马勇
导读:gorm中的核心数据结构,callbacks: callbacks是一个结构体,该结构体包含了一个map结构的processors的字段。该processors是实际的执行器。会有4个对应的processor,分别为:CREATE、QUERY、

gorm中的核心数据结构

  • callbacks:callbacks是一个结构体,该结构体包含了一个map结构的processors的字段。该processors是实际的执行器。会有4个对应的processor,分别为:CREATE、QUERY、DELETE和UPDATE。用于分别执行对应的语句。
  • DryRun:该参数是一个是否执行最终sql语句的一个开关。如果为false,则执行sql语句,否则只将对应的函数编译成sql语句,但不实际执行。
  • 三、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简介

      小编为网友们解答Java基础之编程语言和Java简介的相关话题,接下来IT袋网小编就来介绍。 编程语言是计算机能够理解和识别用户操作意图的一种高级语言。 它包括一系列符号、关键字和语法

    • 帝国cms万能标签 帝国cms灵动标签调用指定栏目或分类下的文章

      帝国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解决方案的相关介绍,接下来就是全面介绍。 以下是一些2023年的顶尖IDPS解决方案,它们代表了各种类型的IDPS技术。 1. Cisco Secure Next-Generation IPS Cisco Secure NG