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