# Goal/QueryBuilder
Goal 的数据库查询构造器为创建和运行数据库查询提供了一个方便的接口。它可以用于支持大部分数据库操作,并与 Goal 支持的所有数据库系统完美运行。并且大量参考了 `Laravel` 的查询构造器设计,你几乎可以在这个库找到所有与 `Laravel` 对应的方法。
Goal 的查询构造器实现了类似 PDO 参数绑定的形式,来保护您的应用程序免受 SQL 注入攻击。因此不必清理因参数绑定而传入的字符串。查询构造器会返回你想要的 SQL 语句以及绑定参数。
## 安装
```bash
go get github.com/goal-web/querybuilder
```
## 运行数据库查询
### 根据条件从表中检索出数据
你可以使用 `NewQuery` 方法来开始查询。该方法为给定的表返回一个查询构造器实例,允许你在查询上链式调用更多的约束,最后使用 get 方法获取结果:
```go
package querybuilder
import (
"fmt"
)
func TestSimpleQueryBuilder() {
query := NewQuery("users").
Where("name", "qbhy").
Where("age", ">", 18).
Where("gender", "!=", 0).
OrWhere("amount", ">=", 100).
WhereIsNull("avatar")
fmt.Println(query.ToSql())
fmt.Println(query.GetBindings())
// select * from users where name = ? and age > ? and gender != ? and avatar is null or amount >= ?
// [qbhy 18 0 100]
}
```
> 你也可以通过 `SelectSql` 方法一次性获取你想要的参数。
> 例如:sql, bindings := NewQuery("users").Where("gender", 1).SelectSql()
### 插入语句
你可以通过 `InsertSql` 或者 `CreateSql` 很方便的生成插入语句。
```go
package querybuilder
import (
"fmt"
"github.com/goal-web/contracts"
)
// TestInsertSql 批量插入数据
func TestInsertSql() {
sql, bindings := NewQuery("users").InsertSql([]contracts.Fields{
{"name": "qbhy", "age": 18, "money": 100000000000},
{"name": "goal", "age": 18, "money": 10},
})
fmt.Println(sql)
fmt.Println(bindings)
// insert into users (name,age,money) values (?,?,?),(?,?,?)
// [qbhy 18 100000000000 goal 18 10]
}
// TestCreateSql 插入单个数据
func TestCreateSql() {
sql, bindings := NewQuery("users").CreateSql(contracts.Fields{
"name": "qbhy", "age": 18, "money": 100000000000,
})
fmt.Println(sql)
fmt.Println(bindings)
// insert into users (name,age,money) values (?,?,?)
//[qbhy 18 100000000000]
}
```
### 更新语句
你可以通过 `UpdateSql` 很方便的生成更新语句。
```go
package querybuilder
import (
"fmt"
"github.com/goal-web/contracts"
)
func TestUpdateSql() {
sql, bindings := NewQuery("users").Where("id", ">", 1).UpdateSql(contracts.Fields{
"name": "qbhy", "age": 18, "money": 100000000000,
})
fmt.Println(sql)
fmt.Println(bindings)
// update users set name = ?,age = ?,money = ? where id > ?
// [qbhy 18 100000000000 1]
}
```
### 删除语句
你可以通过 `DeleteSql` 很方便的生成删除语句。
```go
package querybuilder
import (
"fmt"
)
func TestDeleteSql() {
sql, bindings := NewQuery("users").Where("id", ">", 1).DeleteSql()
fmt.Println(sql)
fmt.Println(bindings)
// delete from users where id > ?
// [1]
}
```
## 更多高级用法
正如开头所说,你可以在这里找到几乎所有与 `Laravel` 对应的查询构造器方法,也可以在 [测试文件](https://github.com/goal-web/querybuilder/blob/master/database_test.go) 中找到更多用法
## 彩蛋 ?
我正在开发一个像 laravel 那样的 Go web 开发框架,并且现在已经完成了大部分主要功能,如果你感兴趣的话,欢迎 star 持续跟踪最新动态
[goal传送门](https://github.com/goal-web)
[goal/query-builder](https://github.com/goal-web/querybuilder)
qbhy0715@qq.com
有疑问加站长微信联系(非本文作者))