## 链接数据
```go
package main
import (
"github.com/gohouse/gorose"
_ "github.com/gohouse/gorose/driver/mysql"
"fmt"
)
type users struct {
Name string `orm:"name"`
Age int `orm:"age"`
Job string `orm:"job"`
}
// DB Config.(Recommend to use configuration file to import)
var DbConfig = &gorose.DbConfigSingle {
Driver: "mysql", // 驱动: mysql/sqlite/oracle/mssql/postgres
EnableQueryLog: false, // 是否开启sql日志
SetMaxOpenConns: 0, // (连接池)最大打开的连接数,默认值为0表示不限制
SetMaxIdleConns: 0, // (连接池)闲置的连接数
Prefix: "", // 表前缀
Dsn: "root:root@tcp(localhost:3306)/test?charset=utf8", // 数据库链接
}
func main() {
connection, err := gorose.Open(DbConfig)
if err != nil {
fmt.Println(err)
return
}
db := connection.NewSession()
}
```
## 构建用户表struct
```go
type User struct {
Name string `orm:"name"`
Age int `orm:"age"`
Job string `rom:"job"`
}
func (u User) TableName() string {
return "users"
}
var user User
var users []User
```
## 原生sql
```go
connection.Query()
// or
db.Query("select * from users limit 1")
db.Query("select * from users where id<?", 10)
db.Execute("update users set job='it' where id=?", 1)
```
## 查询一条
```go
// select * from users limit 1 // 这的*对应的值根据传入类型确定, 如果是struct, 则对应struct字段,否则就是*(所有字段, 下同)
db.Table(&user).Select()
// or
db.Table("users").First()
```
## 查询多条
```go
// select * from users limit 10
db.Table(&users).Limit(10).Select()
// or
db.Table("users").Limit(10).Get()
// 等同于
db.Table("users").Limit(10).Select()
```
## Fields() 指定查询字段 / AddFields()
```go
// select name,job from users limit 1
user := db.Table(&user)
user.Fields("name,job").Select()
// select name,job,age from users limit 1
user.AddFields("age")
user.Fields("name,job").Select()
```
可以手动指定要查询的字段, 那么, 这里查询的结果会优先从Fields api传入的获取, 如果没有, 才会使用struct对应的字段
## Distinct
```go
// select distinct name,age,job from users limit 1
db.Table(&user).Distinct().Select()
```
## Where
```go
// select * from users where id=1
db.Table(&user).Where("id", 1).Select()
// select * from users where id>1
db.Table(&user).Where("id", ">", 1).Select()
// select * from users where id>1 and name like "%fizz%"
db.Table(&user).Where("id", ">", 1).Where("name","like","%fizz%").Select()
```
- OrWhere
```go
// select * from users where id>1 or name like "%fizz%"
db.Table(&user).Where("id", ">", 1).OrWhere("name","like","%fizz%").Select()
```
- WhereNull / WhereNotNull
```go
// select * from users where job is null
db.Table(&users).WhereNull("job").Select()
// select * from users where job is not null
db.Table(&users).WhereNotNull("job").Select()
```
- WhereIn / WhereNotIn / OrWhereIn / OrWhereNotIn
```go
// select * from users where age in (17,18)
db.Table(&users).WhereIn("age",[]interface{}{17, 18}).Select()
...
```
- WhereBetween / WhereBetwee / OrWhereBetween / OrWhereNotBetween
```go
// select * from users where age between 17 and 20
db.Table(&users).WhereBetween("age",[]interface{}{17, 18}).Select()
...
```
## 嵌套where
```go
// SELECT * FROM users
// WHERE id > 1
// and ( name = 'fizz'
// or ( name = 'fizz2'
// and ( name = 'fizz3' or website like 'fizzday%')
// )
// )
// and job = 'it' LIMIT 1
User := db.Table("users")
User.Where("id", ">", 1).Where(func() {
User.Where("name", "fizz").OrWhere(func() {
User.Where("name", "fizz2").Where(func() {
User.Where("name", "fizz3").OrWhere("website", "like", "fizzday%")
})
})
}).Where("job", "it").First()
```
## Join / LeftJoin / RightJoin / CrossJoin / UnionJoin
```go
// 普通示例
// select * from user inner join card on user.id=card.user_id limit 10
db.Table("user")
.Join("card","user.id","=","card.user_id")
.Limit(10)
.Get()
// 左链接
// select * from user a left join card b on a.id=b.user_id limit 1
db.Table("user a")
.LeftJoin("card b on a.id = b.user_id")
.First()
// RightJoin => right join
// CrossJoin => cross join
// UnionJoin => union join
```
默认 `join` 是 `inner join`
## Order / OrderBy
```go
// select * from users order by id desc, job asc
db.Table(&user).Order("id desc, job asc").Select()
```
Order 等同于 orderby
## Group / GroupBy
```go
// select * from users group by job
db.Table(&user).Group("job").Select()
```
Group 等同于 GroupBy
## Limit 和 Offset
```go
// select * from users limit 10 offset 10
db.Table(&user).Limit(10).Offset(10).Select()
```
## Having
```go
// select * from users group by job having age>17
db.Table(&user).Group("job").Having("age>17").Select()
```
## Value 获取一个字段的单一值
```go
// 获取id=1的job
db.Table(&user).Value("job") // it
```
## Pluck 获取表的一列值
```go
// 获取id=1的job
db.Table(&user).Pluck("job") // ["id", "drawer"]
// 可以指定第二个参数, 第二个参数的值, 做为第一个字段值得key, 这两个参数都必须为表的字段
db.Table(&user).Pluck("job", "name") // {"fizz":id", "fizz2":"drawer"}
```
## Sum / Count / Avg / Max / Min 聚合查询
```go
// select sum(age) from users
db.Table(&user).Sum("age")
db.Table(&user).Count()
db.Table(&user).Count("*")
db.Table(&user).Avg("age")
db.Table(&user).Max("age")
db.Table(&user).Min("age")
```
## Chunk 数据分片 大量数据批量处理 (累积处理)
```go
` 当需要操作大量数据的时候, 一次性取出再操作, 不太合理, 就可以使用chunk方法
chunk的第一个参数是指定一次操作的数据量, 根据业务量, 取100条或者1000条都可以
chunk的第二个参数是一个回调方法, 用于书写正常的数据处理逻辑
目的是做到, 无感知处理大量数据
实现原理是, 每一次操作, 自动记录当前的操作位置, 下一次重复取数据的时候, 从当前位置开始取
`
User := db.Table("users")
User.Fields("id, name").Where("id",">",2).Chunk(2, func(data []map[string]interface{}) {
// for _,item := range data {
// fmt.Println(item)
// }
fmt.Println(data)
})
// 打印结果:
// map[id:3 name:gorose]
// map[id:4 name:fizzday]
// map[id:5 name:fizz3]
// map[id:6 name:gohouse]
[map[id:3 name:gorose] map[name:fizzday id:4]]
[map[id:5 name:fizz3] map[id:6 name:gohouse]]
```
##Loop 数据分片 大量数据批量处理 (从头处理)
```go
` 类似 chunk 方法, 实现原理是, 每一次操作, 都是从头开始取数据
原因: 当我们更改数据时, 更改的结果可能作为where条件会影响我们取数据的结果,所以, 可以使用Loop`
User := db.Table("users")
User.Fields("id, name").Where("id",">",2).Loop(2, func(data []map[string]interface{}) {
// for _,item := range data {
// fmt.Println(item)
// }
// 这里执行update / delete 等操作
})
```
## 获取sql记录
- 直接构建sql而不执行
```go
// select 语句
db.Table().BuildSql() // 或者 xxx.BuildSql("select")
// insert
db.Table().Data().BuildSql("insert")
// update, delete
// xxx.BuildSql("update")
// xxx.BuildSql("delete")
```
- 执行过程中获取sql
```go
// 要先新建会话
db := connection.NewSession()
db.Table().xxx()
// 获取最后一条sql
fmt.Println(db.LastSql)
// 获取所有sql
fmt.Println(db.SqlLogs)
```
---
温馨提示, 不要忘了导入对应的驱动, 如 MySQL驱动:
```go
import _ "github.com/gohouse/gorose/driver/mysql"
// or
import _ "github.com/go-sql-driver/mysql"
```