[GORM]基本CRUD
插入数据
使用Create
函数即可向数据库中插入数据。
以结构体User
为例:
type User struct {
Id int64
Name string
Age int64
}
func main(){
//判断文件夹db是否存在,不存在则创建一个,不判断的话无法成功连接数据库
_,err:=os.Open("./db/sys.db")
if !os.IsExist(err){
os.Mkdir("./db",0777)
}
db,_:=gorm.Open(sqlite.Open("./db/sys.db"))
db.AutoMigrate(&entity.User{})//自动创建数据表
db.Create(&entity.User{Name:"张三",Age:18})
}
运行结果如下:
获取数据
获取数据有很多种方法。
Find函数
该函数可以返回找到的第一行数据也可以返回所有数据
func main(){
//数据库连接部分省略,下同
user := entity.User{}
//select * from `users` limit 1
db.Find(&user)
fmt.Printf("id:%d,name:%s,age:%d", user.Id, user.Name, user.Age)
}
func main(){
//数据库连接部分省略,下同
var user []entity.User
//select * from `users`
db.Find(&user)
for _, u := range user {
fmt.Printf("id:%d,name:%s,age:%d\n", u.Id, u.Name, u.Age)
}
}
Find的条件查询
可以利用Find()
的参数实现。
Find(数据存储位置,sql statement语句,占位符值...)
可以按照一定条件查找值。
func main(){
//数据库连接部分省略,下同
var user []entity.User
//select * from `users` where age>15 and name like '张%2'
db.Find(&user, "age>? and name like ?", 15, "张%2")
for _, u := range user {
fmt.Printf("id:%d,name:%s,age:%d\n", u.Id, u.Name, u.Age)
}
}
也可以利用Where
实现。
func main(){
//数据库连接部分省略,下同
var user []entity.User
//select * from `users` where age>15 and name like '张%2'
db.Where("age>? and name like ?", 15, "张%2").Find(&user)
for _, u := range user {
fmt.Printf("id:%d,name:%s,age:%d\n", u.Id, u.Name, u.Age)
}
}
Find的指定列查询
使用Select()
可以查询指定的列
func main(){
//数据库连接部分省略,下同
var user []entity.User
//select name,age from `users`
db.Select("name", "age").Find(&user)
for _, u := range user {
fmt.Printf("id:%d,name:%s,age:%d\n", u.Id, u.Name, u.Age)
}
}
更新数据
更新数据有很多种方法,可以使用两种函数完成。Update
、Updates
和Save
。
以下所有截图都基于一下结果展示
Update函数
该函数可以修改一个列的值,必须使用Model方法确定ID
func main(){
//数据库连接部分省略,下同
user := entity.User{Id: 2}
//update `users` set name='哈哈' where id=2
db.Model(&user).Update("name", "哈哈")
}
修改后:
该函数也可以和Where
一起配合使用:
func main(){
//修改所有姓张的且ID为2的人的信息
//update from `users` set name='哈哈' where id=2 and name like '张%'
user := entity.User{Id: 2}
db.Model(&user).Where("name like '张%'").Update("name", "哈哈")
//上面的语句与下面的语句与下面的语句等价
//db.Model(&entity.User{}).Where("name like '张%' and `id`=2").Update("name","哈哈")
}
func main(){
//修改所有姓张的人的信息,此处,Model函数的参数是一个接口就表明不进行ID筛选。
//update `users` set name='哈哈' like name='张%'
db.Model(&entity.User{}).Where("name like '张%'").Update("name", "哈哈")
}
Updates函数
该函数更新多列的值。
func main(){
//修改ID为2的数据,将名字改为哈哈,将年龄改为17
//update `users` set name='哈哈',age=17 where id=2
user := entity.User{Id: 2, Name: "哈哈", Age: 17}
db.Model(&user).Updates(&user)
}
func main(){
//修改ID为2的数据,将名字改为哈哈,年龄改为20
user := entity.User{Id: 2, Name: "哈哈", Age: 17}
//update `users` set name='哈哈',age=20 where id=2
db.Model(&user).Updates(&entity.User{Name: "哈哈", Age: 20})//可以直接定义对象
}
Updates函数无法修改多行数据因此必须指定要修改的内容。
Save函数
Save会保存所有的值,即使字段是零值。它不能和Model()
一起使用。
删除数据
删除数据使用Delete即可。但必须指定条件,否则会触发批量删除。
func main(){
//删除id为2的数据
user := entity.User{Id: 2}
// delete from `users` where id=2
db.Delete(&user)
}
GORM对批量删除有保护措施。
func main(){
//删除id为2的数据
user := entity.User{}
// delete from `user`
db.Delete(&user)
}
转载自:https://juejin.cn/post/7373623949836091426