05-初始化

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"})

posted on 2022-02-14 23:28  运维开发玄德公  阅读(8)  评论(0编辑  收藏  举报  来源

导航