0

是的没错,我就是抄的。一个像 Laravel 那样好用的 go语言的 SQL 查询构造器

 2 years ago
source link: https://studygolang.com/articles/35413
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

是的没错,我就是抄的。一个像 Laravel 那样好用的 go语言的 SQL 查询构造器

qbhy · 9天之前 · 341 次点击 · 预计阅读时间 3 分钟 · 大约8小时之前 开始浏览    

Goal/QueryBuilder

Goal 的数据库查询构造器为创建和运行数据库查询提供了一个方便的接口。它可以用于支持大部分数据库操作,并与 Goal 支持的所有数据库系统完美运行。并且大量参考了 Laravel 的查询构造器设计,你几乎可以在这个库找到所有与 Laravel 对应的方法。

Goal 的查询构造器实现了类似 PDO 参数绑定的形式,来保护您的应用程序免受 SQL 注入攻击。因此不必清理因参数绑定而传入的字符串。查询构造器会返回你想要的 SQL 语句以及绑定参数。

go get github.com/goal-web/querybuilder

运行数据库查询

根据条件从表中检索出数据

你可以使用 NewQuery 方法来开始查询。该方法为给定的表返回一个查询构造器实例,允许你在查询上链式调用更多的约束,最后使用 get 方法获取结果:

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 很方便的生成插入语句。

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 很方便的生成更新语句。

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 很方便的生成删除语句。

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 对应的查询构造器方法,也可以在 测试文件 中找到更多用法

我正在开发一个像 laravel 那样的 Go web 开发框架,并且现在已经完成了大部分主要功能,如果你感兴趣的话,欢迎 star 持续跟踪最新动态 goal传送门

goal/query-builder
[email protected]


有疑问加站长微信联系(非本文作者))

280

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK