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   运维开发玄德公  阅读(10)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示