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
调用。
定义一个结构体user
给FirstOrInit
调用接收数据。
定义一个结构体,并赋值,给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"})