go语言数据库操作, gorm框架

时间:2022-10-09 17:06:37

type User struct{
ID uint `gorm:"primary_key"`
Name string
Age int
Birthday time.Time
AddTime time.Time
}

连接数据库
db, err := gorm.Open("mysql", "用户名:密码@tcp(地址:端口号)/数据库名")
if err != nil {
panic("连接数据库失败")
}

创建表

db.SingularTable(true) //不设置,创建生成的表名都是默认是复数形式后面带s的,设置上这一句话,就不会默认带s了
//db.CreateTable(&User{}) //创建表

表内插入数据

//user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
//db.Create(&user) //插入数据

查询

查询出所有的数据,查询到的结果是个可循环的切片
type User struct{
ID uint `gorm:"primary_key"`
Name string
Age int
Birthday time.Time
}
var user []User
a :=db.Find(&user) #查询出所有的
打印出来查询的东西
for _, a:= range user {
fmt.Println(a)
fmt.Println(a.ID)
}

查询出所有符合条件的数据,查询到的结果是个可循环的切片

var user []User
//select * from user where name="Jinzhu1"
a :=db.Where("name = ?", "Jinzhu1").Find(&user) //Find是查询所有,First查询出一条
for _, a:= range user {
fmt.Println(a)
fmt.Println(a.ID)
}

db.Where("name = ?", "jinzhu").First(&users) //查询出一条符合的数据
db.Where("name <> ?", "jinzhu").Find(&user) //查出name不等于jinzhu的数据
db.Where("name in (?)", []string{"jinzhu", "jinzhu1"}).Find(&user) //查询出name in ("jinzhu", "jinzhu1") 所有数据
db.Where("name LIKE ?", "%jin%").Find(&user) //模糊查询 select * from user where name LIKE "%jin%"
db.Where("name = ? AND age >= ?", "jinzhu", "17").Find(&user) //select * FROM user Where name ="jinzhu" AND age>17
db.Where(&User{Name: "jinzhu", Age: 20}).First(&user) //SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;
db.Where(map[string]interface{}{"name": "jinzhu", "age": 20}).Find(&users) //SELECT * FROM users WHERE name = "jinzhu" AND age = 20;
db.Where([]int64{1, 2, 3}).Find(&user) //SELECT * FROM users WHERE id IN (20, 21, 22);
用结构体查询的时候,GORM只会与非零条件查询,查询条件中的 0 ,"",false获取他零值,它不会被用来构成查询条件,例如
db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users) // SELECT * FROM users WHERE name = "jinzhu";

查询出来的数据是单条的话
user :=User{}
db.Find(&user) // 查询
fmt.Println(user.ID) //获取使用查询出来的某个字段

更新
单条更新的(包括自动更新的如当前时间的字段)
user :=User{}
db.First(&user) //查询出一条数据
user.Name="334" //给数据赋新值
db.Save(&user) //更新 UPDATE users SET name='334' WHERE id=1;但是如果表中有自动更新的字段,如时间更新当前的时间,那么用Save也会把这些一块更新的

单条更新更新改变字段
user := User{}
db.Model(&user).Update("name","啊") //更新所有的数据 name="啊"

更新符合条件的数据
db.Model(&user).Where("id = ?", 1).Update("name", "hello")
更新所有数据的多个字段
db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 18})
更新所有数据的多个字段
db.Model(&user).Updates(User{Name: "hello", Age: 18})
下面这个不会被更新,只会更新非空白的值,即非 0,false ,""等
db.Model(&user).Updates(User{Name: "", Age: 0})
更新字段忽略选定的字段,下面忽略了name omit中的
db.Model(&user).Omit("name").Updates(map[string]interface{}{"name": "321", "age": 118})
更新选定的字段,只更新name字段即Select里面的字段
db.Model(&user).Select("name").Updates(map[string]interface{}{"name": "hello", "age": 18})

批量更新符合条件的数据
db.Table("user").Where("id IN (?)", []int{1, 2}).Updates(map[string]interface{}{"name": "aa", "age": 9})
db.Model(User{}).Where("id IN (?)",[]int{1,2}).Updates(User{Name: "cc", Age: 13})

删除
user := User{}
db.Delete(&user) //删除表里的所有数据了
带条件的删除
db.Where("name LIKE ?", "%jinzhu%").Delete(User{})