動的SQL

Genは、Raw SQLから完全に型安全な慣用的なGoコードを生成できます。インターフェースへのアノテーションを使用し、これらのインターフェースはコード生成中に複数のモデルに適用できます。

調整されたSQLクエリだけでなく、SQLスニペットも共有および再利用できます。例を見てみましょう。

Raw 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は、条件付きアノテーションと戻り値のカスタマイズをサポートしています。アノテーションを参照して詳細をご覧ください。

プラチナスポンサー

ゴールドスポンサー

プラチナスポンサー

ゴールドスポンサー