1. FirstOrInit
1.1 FirstOrInit(查询表给Struct赋值)
| db.FirstOrInit(&user, xiShu{Name: "LiuBei"}) |
| package main |
| |
| import ( |
| "fmt" |
| "github.com/jinzhu/gorm" |
| _ "github.com/jinzhu/gorm/dialects/mysql" |
| ) |
| type xiShu struct { |
| ID int64 |
| Name string |
| Age int64 |
| } |
| |
| func(xiShu) TableName() string { |
| return "xi_shu" |
| } |
| |
| func main() { |
| |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.FirstOrInit(&user, xiShu{Name: "LiuBei"}) |
| fmt.Println(user) |
| } |
| |
| func connect() (db *gorm.DB,err error) { |
| db, err = gorm.Open("mysql", "root:40010355@tcp(127.0.0.1:3306)/crow?charset=utf8&parseTime=True&loc=Local") |
| if err != nil { |
| fmt.Printf(err.Error()) |
| defer db.Close() |
| }else { |
| fmt.Printf("OK\n") |
| db.DB().SetMaxIdleConns(10) |
| db.DB().SetMaxOpenConns(100) |
| |
| } |
| return |
| } |
结果
| func main() { |
| |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.FirstOrInit(&user, xiShu{Name: "PangTong"}) |
| fmt.Println(user) |
| } |
显示结果
1.2 Attrs (未查到结果给Struct赋值)
| db.Where(xiShu{Name: "HuangZhong"}).Attrs(xiShu{Age: 35}).FirstOrInit(&user) |
| func main() { |
| |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.Where(xiShu{Name: "HuangZhong"}).Attrs(xiShu{Age: 35}).FirstOrInit(&user) |
| fmt.Println(user) |
| } |
结果
查询到结果,用结果赋值,而不使用Attrs()中指定的值
| func main() { |
| |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.Where(xiShu{Name: "LiuBei"}).Attrs(xiShu{Age: 35}).FirstOrInit(&user) |
| fmt.Println(user) |
| } |
结果
1.3 Assign(不论是否查到都将参数赋值给 struct)
| db.Where(xiShu{Name: "LiuBei"}).Assign(xiShu{Age: 35}).FirstOrInit(&user) |
| func main() { |
| |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.Where(xiShu{Name: "LiuBei"}).Assign(xiShu{Age: 35}).FirstOrInit(&user) |
| fmt.Println(user) |
| } |
结果
可见,虽然查到了LiuBei的信息,但age的值25,仍被参数覆盖了。
2. FirstOrCreate
2.1 FirstOrCreate
未查询到结果,将参数赋值给Struct,并且写入表。
| func main() { |
| |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.FirstOrCreate(&user, xiShu{Name: "Pangtong",Age: 25}) |
| fmt.Println(user) |
| } |
输出:
数据库表中多了一条记录

| func main() { |
| |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.FirstOrCreate(&user, xiShu{Name: "LiuBei"}) |
| fmt.Println(user) |
| } |
输出
查看数据库,数据库没有变化
2.2 Attrs
如果未查询到记录,通过给定的参数赋值给 Struct ,然后使用这些值在数据库添加一条记录。
如果查寻到记录,将查询结果赋值给Struct,数据库中不会添加数据。
| db.Where(xiShu{Name: "HuangZhong"}).Attrs(xiShu{Age: 35}).FirstOrCreate(&user) |
| func main() { |
| |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.Where(xiShu{Name: "HuangZhong"}).Attrs(xiShu{Age: 35}).FirstOrCreate(&user) |
| fmt.Println(user) |
| } |
输出
数据库多了一条数据

| func main() { |
| |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.Where(xiShu{Name: "LiuBei"}).Attrs(xiShu{Age: 35}).FirstOrCreate(&user) |
| fmt.Println(user) |
| } |
输出如下:
数据库中未添加记录
2.3 Assign
无论是否查询到,都将其分配给记录,并保存到数据库中。
因为是否查到结果一样,示例只写查到的情况。
| func main() { |
| db,_ := connect() |
| defer db.Close() |
| var user xiShu |
| db.Where(xiShu{Name: "LiuBei"}).Assign(xiShu{Age: 35}).FirstOrCreate(&user) |
| fmt.Println(user) |
| } |
输出
数据库该条记录被修改

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)