ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 添加 ```go // 你可以自己在sql中指定表名。这里是示例 db.Table("user").Create(user) ``` ## 更新 ```go // 注意,Model方法必须要和Update方法一起使用 // 使用效果相当于Model中设置更新的主键key(如果没有where指定,那么默认更新的key为id),Update中设置更新的值 // 如果Model中没有指定id值,且也没有指定where条件,那么将更新全表 // 相当于:update user set name='xiaoming' where id=1; user := User{Id: 1, Name:"xiaoming"} db.Model(&user).Update(user) // 下面这个更新操作只使用了where条件没有在Model中指定id db.Model(&User{}).Where("sex = ?", 1).Update("name", "xiaohong") // 如果你想手动将某个字段set为空值, 可以使用单独选定某些字段的方式来更新: user := User{Id: 1} db.Model(&user).Select("name").Update(map[string]interface{}{"name":"", "age":0}) // 忽略掉某些字段: // 当你的更新的参数为结构体,而结构体中某些字段你又不想去更新,那么可以使用Omit方法过滤掉这些不想update到库的字段: user := User{Id: 1, Name:"xioaming", Age:12} db.Model(&user).Omit("name").Update(&user) ``` ## 删除 ```go // delete from user where id=1; user := User{Id: 1} db.Delete(&user) // delete from user where id > 11; db.Delete(&User{}, "id > ?", 11) ``` ## 事务 ```go tx := db.Begin() // 注意,一旦你在一个事务中,使用tx作为数据库句柄 if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { tx.Rollback() return err } if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { tx.Rollback() return err } tx.Commit() return nil ``` ## 查询 ```go //查询所有记录 db.Find(&u) //Find方法可以带 where 参数 db.Find(&u,"id > ? and age > ?",2,12) //带where 子句的查询,注意where要在find前面 db.Where("id > ?", 2).Find(&u) // where name in ("xiaoming","xiaohong") db.Where("name in (?)",[]string{"xiaoming","xiaohong"}).Find(&u) //获取第一条记录,按照主键顺序排序 db.First(&u) //First方法可以带where 条件 db.First(&u,"where sex = ?",1) //获取最后一条记录,按照主键顺序排序 //同样 last方法也可以带where条件 db.Last(&u) return u ``` ### 指定查询字段-Select ```go //指定查询字段 db.Select("name,age").Where(map[string]interface{}{"age":12,"sex":1}).Find(&u) ``` ### 使用Struct和map作为查询条件 ```go db.Where(&User{Age:12,Sex:1}).Find(&u) ``` ### not 条件的使用 ```go // where name not in ("xiaoming","xiaohong") db.Not("name","xiaoming","xiaohong").Find(&u) //同上 db.Not("name",[]string{"xiaoming","xiaohong"}).Find(&u) ``` ### or 的使用 ```go //where age > 12 or sex = 1 db.Where("age > ?",12).Or("sex = ?",1).Find(&u) ``` ### order by 的使用 ```go //order by age desc db.Where("age > ?",12).Or("sex = ?",1).Order("age desc").Find(&u) ``` ### limit 的使用 ```go //limit 10 db.Not("name",[]string{"xiaoming","xiaohong"}).Limit(10).Find(&u) ``` ### offset 的使用 ```go //limit 300,10 db.Not("name",[]string{"xiaoming","xiaohong"}).Limit(10).Offset(300).Find(&u) ``` ### count(*) ```go //count(*) var count int db.Table("user").Where("age > ?",0).Count(&count) // 注意:这里你在指定表名的情况下sql为:select count(*) from user where age > 0; // 如上代码如果改为: var count int var user []User db.Where("age > ?",0).Find(&user).Count(&count) // 相当于你先查出来[]User,然后统计这个list的长度。跟你预期的sql不相符。 ``` ### group & having ```go rows, _ := db.Table("user").Select("count(*),sex").Group("sex"). Having("age > ?", 10).Rows() for rows.Next() { fmt.Print(rows.Columns()) } ``` ### join ```go db.Table("user u").Select("u.name,u.age").Joins("left join user_ext ue on u.user_id = ue.user_id").Row() // 如果有多个连接,用多个Join方法即可。 ``` ## 原生函数 ```go db.Exec("DROP TABLE user;") db.Exec("UPDATE user SET name=? WHERE id IN (?)", "xiaoming", []int{11,22,33}) db.Exec("select * from user where id > ?",10).Scan(&user) ``` ~~~