動態 SQL

Gen 允許從原始 SQL 產生完全類型安全的慣用語 Go 程式碼,它使用介面的註解,這些介面可以在程式碼產生期間套用至多個模型。

不僅允許共用和重複使用您調整過的 SQL 查詢,也允許共用和重複使用 SQL 片段,讓我們舉個例子

原始 SQL

type Querier interface {
// SELECT * FROM @@table WHERE id=@id
GetByID(id int) (gen.T, error) // GetByID query data by id and return it as *struct*

// GetByRoles query data by roles and return it as *slice of pointer*
// (The below blank line is required to comment for the generated method)
//
// SELECT * FROM @@table WHERE role IN @rolesName
GetByRoles(rolesName ...string) ([]*gen.T, error)

// InsertValue insert value
//
// INSERT INTO @@table (name, age) VALUES (@name, @age)
InsertValue(name string, age int) error
}

g := gen.NewGenerator(gen.Config{
// ... some config
})

// Apply the interface to existing `User` and generated `Employee`
g.ApplyInterface(func(Querier) {}, model.User{}, g.GenerateModel("employee"))

g.Execute()

執行上述組態程式以產生應用程式的查詢介面程式碼,並使用產生的程式碼,如下所示

import "your_project/query"

func main() {
user, err := query.User.GetByID(10)

employees, err := query.Employee.GetByRoles("admin", "manager")

err := query.User.InsertValue("modi", 18)
}

程式碼片段

程式碼片段通常與 DAO 介面 一起使用

type Querier interface {
// FindByNameAndAge query data by name and age and return it as map
//
// where("name=@name AND age=@age")
FindByNameAndAge(name string, age int) (gen.M, error)
}

g := gen.NewGenerator(gen.Config{
// ... some config
})

// Apply the interface to existing `User` and generated `Employee`
g.ApplyInterface(func(Querier) {}, model.User{}, g.GenerateModel("employee"))

g.Execute()

用法

import "your_project/query"

func main() {
userMap, err := query.User.Where(query.User.Name.Eq("modi")).FilterWithNameAndRole("modi", "admin")
}

更多控制

Gen 支援條件式註解和自訂傳回結果,請參閱 註解 以瞭解更多資訊

白金贊助商

黃金贊助商

白金贊助商

黃金贊助商