gorm增删改查
// 连接数据库
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
var GLOBAL_DB *gorm.DB
func main() {
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: "root:root@tcp(127.0.0.1:8889)/test_gorm?charset=utf8mb4&parseTime=True&loc=Local", // DSN data source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{
SkipDefaultTransaction: false, // 是否跳过默认事务
NamingStrategy: schema.NamingStrategy{ // 设置表名相关配置
TablePrefix: "", // 标签缀
SingularTable: true, // 如果为true的话,表默认创建为单数,比如user
},
DisableForeignKeyConstraintWhenMigrating: true, // 是否跳过外键约束,建议设置为true
})
if err != nil {
fmt.Println("连接数据库失败:", err.Error())
}
GLOBAL_DB = db
}
新增数据
- 新增一条数据
type User struct {
gorm.Model
Name string `gorm:"defalut:yiqi"`
Age uint8 `gorm:"comment:年龄"`
}
GLOBAL_DB.AutoMigrate(&User{})
res := GLOBAL_DB.Create(&User{ // 新增一条数据
Name: "颖小主",
Age: 18,
})
fmt.Println(res.Error, res.RowsAffected) // res.Error错误信息,RowsAffected影响条数, 输出结果<nil> 1
- 只新增指定字段数据
res := GLOBAL_DB.Select("name").Create(&User{ // 只新增name字段
Name: "颖小主",
Age: 18,
})
- 除了指定字段,其他的都新增
res := GLOBAL_DB.Omit("name").Create(&User{ // 忽略了name字段
Name: "颖小主",
Age: 18,
})
- 一次性创建多条数据
res := GLOBAL_DB.Create(&[]User {
{Name: "颖小主", Age: 18},
{Name: "itffz", Age: 20},
})
查询
- 查询排序后的第一条数据
var result map[string]interface{} // var result = make(map[string]interface{})
GLOBAL_DB.Model(&User{}).First(&result)
fmt.Println(result)
// 或者
var TestUser User
GLOBAL_DB.Model(&User{}).First(&TestUser)
fmt.Println(TestUser) // {{1 2022-04-19 23:55:19 +0800 CST 2022-04-19 23:55:19 +0800 CST {0001-01-01 00:00:00 +0000 UTC false}} 颖小主 18}
- 查询最后一条数据
var TestUser User
GLOBAL_DB.Model(&User{}).Last(&TestUser)
fmt.Println(TestUser)
主键检索
GLOBAL_DB.Model(&User{}).First(&TestUser, 1) // 1 就是主键id=1的
fmt.Println(errors.Is(res.Error, gorm.ErrRecordNotFound)) // 判断是否查询到了数据,如果查询到了这里输出false,如果没有查询到,这里输出true,并吧sql语句打印出来
where查询
- sql语句方式
GLOBAL_DB.Where("name = ? and age = ?", "itffz", 20).First(&User{})
- 结构体方式
type TestUser struct {
Name string
}
GLOBAL_DB.Where(TestUser {
Name: "itffz",
}).First(&User{})
fmt.Println(&User{})
- map方式
GLOBAL_DB.Where(map[string]interface{} {
"name": "颖小主",
}).First(&User{})
fmt.Println(&User{})
find查询多条数据
var TestUser []User
GLOBAL_DB.Where("name like ?", "%it%").Find(&TestUser)
fmt.Println(TestUser)
更新
update 只更新选择的字段
Updates 更新所有字段 此时有两种形式,一种为map 一种为结构体,结构体零值不参与更新
save 无论如何都更新所有内容,包括0值
- update
GLOBAL_DB.Model(&User{}).Where("id = ?", 1).Update("name", 123)
- save
var users []User
res := GLOBAL_DB.Where("id = ?", 1).Find(&users)
for k := range users{
users[k].Age = 12
}
res.Save(&users)
- updates
var users User
GLOBAL_DB.First(&users).Updates(User{Name:"", Age: 1}) // 结构体方式,注意,结构题方式空值,0值是不参与更新的,所以这里只有age字段被更新了
GLOBAL_DB.First(&users).Updates(map[string]interface{} {"Name": "", "Age": 0}) // map形式,注意,map形式全部参与更新
删除
type users []User
GLOBAL_DB.Where("id = ?", 1).Delete(&users) // 删除符合条件的所有数据,注意这是软删除,软删除会将deleted_at赋值一个当前的时间
GLOBAL_DB.Unscoped().Where("id = ?", 2).Delete(&users) // 这个删除会把数据库中的数据彻底删除
原生sql
var users []User
LOBAL_DB.Raw("select * from user where id > ?", 2).Scan(&users)
fmt.Println(&users)