美文网首页
grom-V2-05-初始化

grom-V2-05-初始化

作者: 玄德公笔记 | 来源:发表于2022-02-14 23:25 被阅读0次

1. FirstOrInit

注意
FirstOrInit只会赋值给结构体,而不会写入表
FirstOrCreate会写入表中

1.1 基本使用

1.1.1 使用说明

根据参数查表,
查到,则赋值给结构体;
没查到,结构体只能得到查询条件的值。

db.FirstOrInit(&user, User{Name: "LiuBei"})

1.1.2 完整示例

  • 代码
package main

import (
    "database/sql"
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "time"
)

type User struct {
    ID int64
    Age int64
    Name string
    Email string
    Company string
}



func main() {
    db,sqlDB,_ := connect()
    defer sqlDB.Close()

    var user User
    db.FirstOrInit(&user, User{Name: "LiuBei"})
    fmt.Println(user)
}

func connect() (db *gorm.DB,sqlDB *sql.DB,err error) {
    dsn := "root:40010355@tcp(127.0.0.1:3306)/crow?charset=utf8&parseTime=True&loc=Local"
    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    sqlDB,_ = db.DB()
    if err != nil {
        fmt.Printf(err.Error())
        defer sqlDB.Close()
    }else {
        fmt.Printf("OK\n")
        sqlDB.SetMaxIdleConns(10)
        sqlDB.SetMaxOpenConns(100)
        sqlDB.SetConnMaxLifetime(time.Hour)
    }
    return
}

查到,则将结果赋值给结构体:

OK
{1 28 LiuBei liubei@xishu.com shu}

未查到,则结构他仅获得查询条件的值:

{0 0 LiuBei  }

1.2 Attrs (未查到结果时给Struct赋值)

1.2.1 使用说明

Attrs写在FirstOrInit前,FirstOrInit没有查到结果时,将接收Attrs的参数的数据

db.Attrs(GuanYu).FirstOrInit(&user, User{Name: "GuanYu"})

1.2.2 示例

  • 思路
    定义一个结构体GuanYu,并赋值,给Attrs调用。
    定义一个结构体userFirstOrInit调用接收数据。
    定义一个结构体,并赋值,给FirstOrInit作为查询条件用。

  • 过程
    当FirstOrInit查到结果时,会直接将结果给user
    如果没查到,他会使用Attrs调用的GuanYu结构体,并将值赋给user

  • 原表

mysql> select * from users;
+----+----------+------+--------------------+---------+
| id | name     | age  | email              | company |
+----+----------+------+--------------------+---------+
|  1 | LiuBei   |   28 | liubei@xishu.com   | shu     |
|  2 | GuanYu   |   22 | guanyu@xishu.com   | shu     |
|  3 | ZhangFei |   18 | zhangfei@xishu.com | shu     |
+----+----------+------+--------------------+---------+
3 rows in set (0.00 sec)
  • 代码
func main() {
    db,sqlDB,_ := connect()
    defer sqlDB.Close()
    GuanYu := User{
        ID: 3,
        Name: "GuanYu",
        Age: 22,
        Email: "guanyu@xishu.com",
        Company: "shu",
    }

    var user User
    db.Attrs(GuanYu).FirstOrInit(&user, User{Name: "GuanYu"})
    fmt.Println(user)
}
  • 输出

因为查到关羽,则输出了关羽的信息

OK
{2 22 GuanYu guanyu@xishu.com shu}
  • 若未查到,则应该输入结构体GuanYu中定义的武胜信息
OK
{0 99 WuSheng guanyu@xishu.com shen}

1.3 Assign(不论是否查到都将参数赋值给 struct)

1.3.1 使用说明

  • 作用
    Assign写在FirstOrInit前,不管FirstOrInit是否查到数据,都将接收Attrs的参数的数据

  • 使用
    定义一个结构体作为Assign的参数,覆盖FirstOrInit查到的部分数据

  • 样例

db.Where(xiShu{Name: "LiuBei"}).Assign(xiShu{Age: 35}).FirstOrInit(&user)

1.3.2 示例

  • 代码
func main() {
    db,sqlDB,_ := connect()
    defer sqlDB.Close()
    GuanYu := User{
        Name: "WuSheng",
        Company: "shen",
    }

    var user User
    db.Assign(GuanYu).FirstOrInit(&user, User{Name: "GuanYu"})
    fmt.Println(user)
}
  • 查到结果的输出
OK
{2 22 WuSheng guanyu@xishu.com shen}
  • 查不到结果的输出
OK
{0 0 WuSheng  shen}

2. FirstOrCreate

2.1 基本使用

2.1.1 使用说明

2.2.2 示例

  • 代码
func main() {
    db,sqlDB,_ := connect()
    defer sqlDB.Close()

    var user User
    db.FirstOrCreate(&user, User{Name: "ZhaoYun"})
    fmt.Println(user)
}
  • 未查到的输出
OK
{31 0 ZhaoYun  }
  • 未查到数据,依然会向表里添加一条记录

这条数据仅接收到查询条件

mysql> select * from users;
+----+----------+------+--------------------+---------+
| id | name     | age  | email              | company |
+----+----------+------+--------------------+---------+
|  1 | LiuBei   |   28 | liubei@xishu.com   | shu     |
|  2 | GuanYu   |   22 | guanyu@xishu.com   | shu     |
|  3 | ZhangFei |   18 | zhangfei@xishu.com | shu     |
| 31 | ZhaoYun  |    0 |                    |         |
+----+----------+------+--------------------+---------+
4 rows in set (0.00 sec)
  • 查到结果的输出

查到结果会赋值给接收的结构体,表中不会增加数据。

OK
{31 18 ZhaoYun ZhaoYun@xishu.com shu}

2.2 Attrs

  • 使用
    FirstOrInit中的方法相同。未查到生效
  • 样例
db.Attrs(ZhaoYun).FirstOrCreate(&user, User{Name: "ZhaoYun"})

2.3 Assign

  • 使用
    FirstOrInit中的方法相同。是否查到都覆盖表中数据
  • 样例
db.Assign(ZhaoYun).FirstOrCreate(&user, User{Name: "ZhaoYun"})

相关文章

  • grom-V2-05-初始化

    1. FirstOrInit 注意:FirstOrInit只会赋值给结构体,而不会写入表FirstOrCreate...

  • Swift 5.1 (14) - 初始化和反初始化

    Swift 5.1 (14) - 初始化和反初始化Swift 5.1 (14) - 初始化和反初始化

  • 字符串初始化方式比较

    初始化方法一: 用new String初始化的存储方式: 初始化方法2: 用"="初始化的存储方式: 此方法初始化...

  • 2020-07-21 类属性和对象属性 初始化

    对象属性初始化有3种方式: 声明对象属性时初始化 在构造方法中初始化 在初始化块中初始化 类属性初始化有2种方式:...

  • Swift5.1学习随笔之初始化器

    初始化器 类、结构体、枚举都可以定义初始化器(init) 类有2种初始化器:指定初始化器、便捷初始化器 指定初始化...

  • javaSE回顾_05

    数组: 静态初始化: //静态初始化 int[] a = {1,2,3}; 动态初始化: //动态初始化 int[...

  • 第3章 标准库类型string、vector、数组

    1.string的几种初始化方式 直接初始化与拷贝初始化拷贝初始化使用=,而直接初始化不使用 2. cbegin ...

  • 重捡Java(十二)类与对象 属性初始化

    对象属性初始化 对象属性初始化有3种1. 声明该属性的时候初始化2. 构造方法中初始化3. 初始化块 类属性初始化...

  • 十二、初始化

    初始化 类、结构体、枚举都可以定义初始化器 (本章主要讲类的初始化) 类有2种初始化器 指定初始化器 便捷初始化器...

  • [C++之旅] 11 初始化列表

    [C++之旅] 11 初始化列表 初始化列表的特性 初始化列表先于构造函数执行 初始化列表只能用于构造函数 初始化...

网友评论

      本文标题:grom-V2-05-初始化

      本文链接:https://www.haomeiwen.com/subject/xtfxlrtx.html