在接口的方法上的注释,Gen将解析它们并为应用的结构生成查询 API。
Gen 提供一些有条件的 SQL 动态支持,让我们从三个方面介绍它们:
- 返回结果
- 模板占位符
- 模板表达式
返回结果
Gen 允许配置返回的结果类型,它支持以下四种基本类型。
Option | Description |
---|---|
gen.T | returns struct |
gen.M | returns map |
gen.RowsAffected | returns rowsAffected returned from database (type: int64) |
error | returns error if any |
e.g:
type Querier interface { |
这些基本类型可以与其他符号,例如 * <code>[]
, 例如:
type Querier interface { |
模板占位符
Gen 提供了一些占位符来生成动态且安全的 SQL
Name | Description |
---|---|
@@table |
escaped & quoted table name |
@@<name> |
escaped & quoted table/column name from params |
@<name> |
SQL query params from params |
e.g:
type Filter interface { |
生成代码后,您可以在应用程序中直接使用。
import "your_project/query" |
模板表达式
Gen 提供强大的表达式支持动态条件SQL,目前支持以下表达式:
if/else
where
set
for
if/else
The if/else
expression allows to use golang syntax as condition, it can be written like:
{{if cond1}} |
例如:
type Querier interface { |
一个更复杂的案例:
type Querier interface { |
如何使用它:
query.User.QueryWith(&User{Name: "zhangqiang"}) |
where
The where
expression make you write the WHERE
clause for the SQL query easier, let take a simple case as example:
type Querier interface { |
使用生成的代码,您可以使用它:
query.User.Query(10) |
Here is another complicated case, in this case, you will learn the WHERE
clause only be inserted if there are any children expressions matched and it can smartly trim uncessary and
, or
, xor
, ,
inside the where
clause.
type Querier interface { |
The generated code can be used like:
var ( |
set
The set
expression used to generate the SET
clause for the SQL query, it will trim uncessary ,
automatically, for example:
// UPDATE @@table |
The generated code can be used like:
query.User.Update(User{Name: "jinzhu", Age: 18}, 10) |
for
The for
expression iterates over a slice to generate the SQL, let’s explain by example
// SELECT * FROM @@table |
Usage:
query.User.Filter([]User{ |