## 添加
```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)
```
~~~