ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 链接数据 ```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" ```