是的沒錯,我就是抄的。一個像 Laravel 那樣的 go語言的查詢構造器

qbhy發表於2022-01-20

Goal 的資料庫查詢構造器為建立和執行資料庫查詢提供了一個方便的介面。它可以用於支援大部分資料庫操作,並與 Goal 支援的所有資料庫系統完美執行。並且大量參考了 Laravel 的查詢構造器設計,你幾乎可以在這個庫找到所有與 Laravel 對應的方法。

Goal 的查詢構造器實現了類似 PDO 引數繫結的形式,來保護您的應用程式免受 SQL 注入攻擊。因此不必清理因引數繫結而傳入的字串。查詢構造器會返回你想要的 SQL 語句以及繫結引數。

執行資料庫查詢

根據條件從表中檢索出資料

你可以使用 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 money = ?,name = ?,age = ? 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
qbhy0715@qq.com

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章