diff --git a/internal/codegen/golang/query.go b/internal/codegen/golang/query.go index 2c5e29393d..63ee7f68de 100644 --- a/internal/codegen/golang/query.go +++ b/internal/codegen/golang/query.go @@ -7,11 +7,12 @@ import ( ) type QueryValue struct { - Emit bool - Name string - Struct *Struct - Typ string - SQLPackage SQLPackage + Emit bool + EmitPointer bool + Name string + Struct *Struct + Typ string + SQLPackage SQLPackage } func (v QueryValue) EmitStruct() bool { @@ -22,6 +23,10 @@ func (v QueryValue) IsStruct() bool { return v.Struct != nil } +func (v QueryValue) IsPointer() bool { + return v.EmitPointer && v.Struct != nil +} + func (v QueryValue) isEmpty() bool { return v.Typ == "" && v.Name == "" && v.Struct == nil } @@ -30,7 +35,7 @@ func (v QueryValue) Pair() string { if v.isEmpty() { return "" } - return v.Name + " " + v.Type() + return v.Name + " " + v.DefineType() } func (v QueryValue) Type() string { @@ -43,6 +48,21 @@ func (v QueryValue) Type() string { panic("no type for QueryValue: " + v.Name) } +func (v *QueryValue) DefineType() string { + t := v.Type() + if v.IsPointer() { + return "*" + t + } + return t +} + +func (v *QueryValue) ReturnName() string { + if v.IsPointer() { + return "&" + v.Name + } + return v.Name +} + func (v QueryValue) Params() string { if v.isEmpty() { return "" diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index 56b64dac50..65069151ef 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -183,6 +183,7 @@ func buildQueries(r *compiler.Result, settings config.CombinedSettings, structs Name: "arg", Struct: columnsToStruct(r, gq.MethodName+"Params", cols, settings, false), SQLPackage: sqlpkg, + EmitPointer: settings.Go.EmitParamsStructPointers, } } @@ -229,10 +230,11 @@ func buildQueries(r *compiler.Result, settings config.CombinedSettings, structs emit = true } gq.Ret = QueryValue{ - Emit: emit, - Name: "i", - Struct: gs, - SQLPackage: sqlpkg, + Emit: emit, + Name: "i", + Struct: gs, + SQLPackage: sqlpkg, + EmitPointer: settings.Go.EmitResultStructPointers, } } diff --git a/internal/codegen/golang/templates/pgx/interfaceCode.tmpl b/internal/codegen/golang/templates/pgx/interfaceCode.tmpl index 11546a532d..a7e48974d3 100644 --- a/internal/codegen/golang/templates/pgx/interfaceCode.tmpl +++ b/internal/codegen/golang/templates/pgx/interfaceCode.tmpl @@ -2,10 +2,10 @@ type Querier interface { {{- range .GoQueries}} {{- if eq .Cmd ":one"}} - {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.Type}}, error) + {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) {{- end}} {{- if eq .Cmd ":many"}} - {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.Type}}, error) + {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) {{- end}} {{- if eq .Cmd ":exec"}} {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) error diff --git a/internal/codegen/golang/templates/pgx/queryCode.tmpl b/internal/codegen/golang/templates/pgx/queryCode.tmpl index 3970a19a7c..f5c9e3ed58 100644 --- a/internal/codegen/golang/templates/pgx/queryCode.tmpl +++ b/internal/codegen/golang/templates/pgx/queryCode.tmpl @@ -22,34 +22,34 @@ type {{.Ret.Type}} struct { {{- range .Ret.Struct.Fields}} {{if eq .Cmd ":one"}} {{range .Comments}}//{{.}} {{end -}} -func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.Type}}, error) { +func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) { row := q.db.QueryRow(ctx, {{.ConstantName}}, {{.Arg.Params}}) var {{.Ret.Name}} {{.Ret.Type}} err := row.Scan({{.Ret.Scan}}) - return {{.Ret.Name}}, err + return {{.Ret.ReturnName}}, err } {{end}} {{if eq .Cmd ":many"}} {{range .Comments}}//{{.}} {{end -}} -func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.Type}}, error) { +func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { rows, err := q.db.Query(ctx, {{.ConstantName}}, {{.Arg.Params}}) if err != nil { return nil, err } defer rows.Close() {{- if $.EmitEmptySlices}} - items := []{{.Ret.Type}}{} + items := []{{.Ret.DefineType}}{} {{else}} - var items []{{.Ret.Type}} + var items []{{.Ret.DefineType}} {{end -}} for rows.Next() { var {{.Ret.Name}} {{.Ret.Type}} if err := rows.Scan({{.Ret.Scan}}); err != nil { return nil, err } - items = append(items, {{.Ret.Name}}) + items = append(items, {{.Ret.ReturnName}}) } if err := rows.Err(); err != nil { return nil, err diff --git a/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl b/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl index a4e2c79d9e..5705c69fd1 100644 --- a/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl +++ b/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl @@ -2,10 +2,10 @@ type Querier interface { {{- range .GoQueries}} {{- if eq .Cmd ":one"}} - {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.Type}}, error) + {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) {{- end}} {{- if eq .Cmd ":many"}} - {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.Type}}, error) + {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) {{- end}} {{- if eq .Cmd ":exec"}} {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) error diff --git a/internal/codegen/golang/templates/stdlib/queryCode.tmpl b/internal/codegen/golang/templates/stdlib/queryCode.tmpl index 0cda9c8a10..1b06f4e1a8 100644 --- a/internal/codegen/golang/templates/stdlib/queryCode.tmpl +++ b/internal/codegen/golang/templates/stdlib/queryCode.tmpl @@ -22,7 +22,7 @@ type {{.Ret.Type}} struct { {{- range .Ret.Struct.Fields}} {{if eq .Cmd ":one"}} {{range .Comments}}//{{.}} {{end -}} -func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.Type}}, error) { +func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.DefineType}}, error) { {{- if $.EmitPreparedQueries}} row := q.queryRow(ctx, q.{{.FieldName}}, {{.ConstantName}}, {{.Arg.Params}}) {{- else}} @@ -30,14 +30,14 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.Ty {{- end}} var {{.Ret.Name}} {{.Ret.Type}} err := row.Scan({{.Ret.Scan}}) - return {{.Ret.Name}}, err + return {{.Ret.ReturnName}}, err } {{end}} {{if eq .Cmd ":many"}} {{range .Comments}}//{{.}} {{end -}} -func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.Type}}, error) { +func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { {{- if $.EmitPreparedQueries}} rows, err := q.query(ctx, q.{{.FieldName}}, {{.ConstantName}}, {{.Arg.Params}}) {{- else}} @@ -48,16 +48,16 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret. } defer rows.Close() {{- if $.EmitEmptySlices}} - items := []{{.Ret.Type}}{} + items := []{{.Ret.DefineType}}{} {{else}} - var items []{{.Ret.Type}} + var items []{{.Ret.DefineType}} {{end -}} for rows.Next() { var {{.Ret.Name}} {{.Ret.Type}} if err := rows.Scan({{.Ret.Scan}}); err != nil { return nil, err } - items = append(items, {{.Ret.Name}}) + items = append(items, {{.Ret.ReturnName}}) } if err := rows.Close(); err != nil { return nil, err diff --git a/internal/config/config.go b/internal/config/config.go index 90f41da815..c7b1fbbe60 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -110,23 +110,25 @@ type SQLGen struct { } type SQLGo struct { - EmitInterface bool `json:"emit_interface" yaml:"emit_interface"` - EmitJSONTags bool `json:"emit_json_tags" yaml:"emit_json_tags"` - EmitDBTags bool `json:"emit_db_tags" yaml:"emit_db_tags"` - EmitPreparedQueries bool `json:"emit_prepared_queries" yaml:"emit_prepared_queries"` - EmitExactTableNames bool `json:"emit_exact_table_names,omitempty" yaml:"emit_exact_table_names"` - EmitEmptySlices bool `json:"emit_empty_slices,omitempty" yaml:"emit_empty_slices"` - EmitExportedQueries bool `json:"emit_exported_queries" yaml:"emit_exported_queries"` - JSONTagsCaseStyle string `json:"json_tags_case_style,omitempty" yaml:"json_tags_case_style"` - Package string `json:"package" yaml:"package"` - Out string `json:"out" yaml:"out"` - Overrides []Override `json:"overrides,omitempty" yaml:"overrides"` - Rename map[string]string `json:"rename,omitempty" yaml:"rename"` - SQLPackage string `json:"sql_package" yaml:"sql_package"` - OutputDBFileName string `json:"output_db_file_name,omitempty" yaml:"output_db_file_name"` - OutputModelsFileName string `json:"output_models_file_name,omitempty" yaml:"output_models_file_name"` - OutputQuerierFileName string `json:"output_querier_file_name,omitempty" yaml:"output_querier_file_name"` - OutputFilesSuffix string `json:"output_files_suffix,omitempty" yaml:"output_files_suffix"` + EmitInterface bool `json:"emit_interface" yaml:"emit_interface"` + EmitJSONTags bool `json:"emit_json_tags" yaml:"emit_json_tags"` + EmitDBTags bool `json:"emit_db_tags" yaml:"emit_db_tags"` + EmitPreparedQueries bool `json:"emit_prepared_queries" yaml:"emit_prepared_queries"` + EmitExactTableNames bool `json:"emit_exact_table_names,omitempty" yaml:"emit_exact_table_names"` + EmitEmptySlices bool `json:"emit_empty_slices,omitempty" yaml:"emit_empty_slices"` + EmitExportedQueries bool `json:"emit_exported_queries" yaml:"emit_exported_queries"` + EmitResultStructPointers bool `json:"emit_result_struct_pointers" yaml:"emit_result_struct_pointers"` + EmitParamsStructPointers bool `json:"emit_params_struct_pointers" yaml:"emit_params_struct_pointers"` + JSONTagsCaseStyle string `json:"json_tags_case_style,omitempty" yaml:"json_tags_case_style"` + Package string `json:"package" yaml:"package"` + Out string `json:"out" yaml:"out"` + Overrides []Override `json:"overrides,omitempty" yaml:"overrides"` + Rename map[string]string `json:"rename,omitempty" yaml:"rename"` + SQLPackage string `json:"sql_package" yaml:"sql_package"` + OutputDBFileName string `json:"output_db_file_name,omitempty" yaml:"output_db_file_name"` + OutputModelsFileName string `json:"output_models_file_name,omitempty" yaml:"output_models_file_name"` + OutputQuerierFileName string `json:"output_querier_file_name,omitempty" yaml:"output_querier_file_name"` + OutputFilesSuffix string `json:"output_files_suffix,omitempty" yaml:"output_files_suffix"` } type SQLKotlin struct { diff --git a/internal/config/v_one.go b/internal/config/v_one.go index 4a60e0cba9..8cb86c68c8 100644 --- a/internal/config/v_one.go +++ b/internal/config/v_one.go @@ -16,25 +16,27 @@ type V1GenerateSettings struct { } type v1PackageSettings struct { - Name string `json:"name" yaml:"name"` - Engine Engine `json:"engine,omitempty" yaml:"engine"` - Path string `json:"path" yaml:"path"` - Schema Paths `json:"schema" yaml:"schema"` - Queries Paths `json:"queries" yaml:"queries"` - EmitInterface bool `json:"emit_interface" yaml:"emit_interface"` - EmitJSONTags bool `json:"emit_json_tags" yaml:"emit_json_tags"` - EmitDBTags bool `json:"emit_db_tags" yaml:"emit_db_tags"` - EmitPreparedQueries bool `json:"emit_prepared_queries" yaml:"emit_prepared_queries"` - EmitExactTableNames bool `json:"emit_exact_table_names,omitempty" yaml:"emit_exact_table_names"` - EmitEmptySlices bool `json:"emit_empty_slices,omitempty" yaml:"emit_empty_slices"` - EmitExportedQueries bool `json:"emit_exported_queries,omitempty" yaml:"emit_exported_queries"` - JSONTagsCaseStyle string `json:"json_tags_case_style,omitempty" yaml:"json_tags_case_style"` - SQLPackage string `json:"sql_package" yaml:"sql_package"` - Overrides []Override `json:"overrides" yaml:"overrides"` - OutputDBFileName string `json:"output_db_file_name,omitempty" yaml:"output_db_file_name"` - OutputModelsFileName string `json:"output_models_file_name,omitempty" yaml:"output_models_file_name"` - OutputQuerierFileName string `json:"output_querier_file_name,omitempty" yaml:"output_querier_file_name"` - OutputFilesSuffix string `json:"output_files_suffix,omitempty" yaml:"output_files_suffix"` + Name string `json:"name" yaml:"name"` + Engine Engine `json:"engine,omitempty" yaml:"engine"` + Path string `json:"path" yaml:"path"` + Schema Paths `json:"schema" yaml:"schema"` + Queries Paths `json:"queries" yaml:"queries"` + EmitInterface bool `json:"emit_interface" yaml:"emit_interface"` + EmitJSONTags bool `json:"emit_json_tags" yaml:"emit_json_tags"` + EmitDBTags bool `json:"emit_db_tags" yaml:"emit_db_tags"` + EmitPreparedQueries bool `json:"emit_prepared_queries" yaml:"emit_prepared_queries"` + EmitExactTableNames bool `json:"emit_exact_table_names,omitempty" yaml:"emit_exact_table_names"` + EmitEmptySlices bool `json:"emit_empty_slices,omitempty" yaml:"emit_empty_slices"` + EmitExportedQueries bool `json:"emit_exported_queries,omitempty" yaml:"emit_exported_queries"` + EmitResultStructPointers bool `json:"emit_result_struct_pointers" yaml:"emit_result_struct_pointers"` + EmitParamsStructPointers bool `json:"emit_params_struct_pointers" yaml:"emit_params_struct_pointers"` + JSONTagsCaseStyle string `json:"json_tags_case_style,omitempty" yaml:"json_tags_case_style"` + SQLPackage string `json:"sql_package" yaml:"sql_package"` + Overrides []Override `json:"overrides" yaml:"overrides"` + OutputDBFileName string `json:"output_db_file_name,omitempty" yaml:"output_db_file_name"` + OutputModelsFileName string `json:"output_models_file_name,omitempty" yaml:"output_models_file_name"` + OutputQuerierFileName string `json:"output_querier_file_name,omitempty" yaml:"output_querier_file_name"` + OutputFilesSuffix string `json:"output_files_suffix,omitempty" yaml:"output_files_suffix"` } func v1ParseConfig(rd io.Reader) (Config, error) { @@ -110,22 +112,24 @@ func (c *V1GenerateSettings) Translate() Config { Queries: pkg.Queries, Gen: SQLGen{ Go: &SQLGo{ - EmitInterface: pkg.EmitInterface, - EmitJSONTags: pkg.EmitJSONTags, - EmitDBTags: pkg.EmitDBTags, - EmitPreparedQueries: pkg.EmitPreparedQueries, - EmitExactTableNames: pkg.EmitExactTableNames, - EmitEmptySlices: pkg.EmitEmptySlices, - EmitExportedQueries: pkg.EmitExportedQueries, - Package: pkg.Name, - Out: pkg.Path, - SQLPackage: pkg.SQLPackage, - Overrides: pkg.Overrides, - JSONTagsCaseStyle: pkg.JSONTagsCaseStyle, - OutputDBFileName: pkg.OutputDBFileName, - OutputModelsFileName: pkg.OutputModelsFileName, - OutputQuerierFileName: pkg.OutputQuerierFileName, - OutputFilesSuffix: pkg.OutputFilesSuffix, + EmitInterface: pkg.EmitInterface, + EmitJSONTags: pkg.EmitJSONTags, + EmitDBTags: pkg.EmitDBTags, + EmitPreparedQueries: pkg.EmitPreparedQueries, + EmitExactTableNames: pkg.EmitExactTableNames, + EmitEmptySlices: pkg.EmitEmptySlices, + EmitExportedQueries: pkg.EmitExportedQueries, + EmitResultStructPointers: pkg.EmitResultStructPointers, + EmitParamsStructPointers: pkg.EmitParamsStructPointers, + Package: pkg.Name, + Out: pkg.Path, + SQLPackage: pkg.SQLPackage, + Overrides: pkg.Overrides, + JSONTagsCaseStyle: pkg.JSONTagsCaseStyle, + OutputDBFileName: pkg.OutputDBFileName, + OutputModelsFileName: pkg.OutputModelsFileName, + OutputQuerierFileName: pkg.OutputQuerierFileName, + OutputFilesSuffix: pkg.OutputFilesSuffix, }, }, }) diff --git a/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/db.go b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/db.go new file mode 100644 index 0000000000..6a99519302 --- /dev/null +++ b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/db.go @@ -0,0 +1,29 @@ +// Code generated by sqlc. DO NOT EDIT. + +package querytest + +import ( + "context" + "database/sql" +) + +type DBTX interface { + ExecContext(context.Context, string, ...interface{}) (sql.Result, error) + PrepareContext(context.Context, string) (*sql.Stmt, error) + QueryContext(context.Context, string, ...interface{}) (*sql.Rows, error) + QueryRowContext(context.Context, string, ...interface{}) *sql.Row +} + +func New(db DBTX) *Queries { + return &Queries{db: db} +} + +type Queries struct { + db DBTX +} + +func (q *Queries) WithTx(tx *sql.Tx) *Queries { + return &Queries{ + db: tx, + } +} diff --git a/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/models.go b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/models.go new file mode 100644 index 0000000000..5d38c1d2d3 --- /dev/null +++ b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/models.go @@ -0,0 +1,12 @@ +// Code generated by sqlc. DO NOT EDIT. + +package querytest + +import ( + "database/sql" +) + +type Foo struct { + A sql.NullInt32 + B sql.NullInt32 +} diff --git a/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/querier.go b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/querier.go new file mode 100644 index 0000000000..075bbc63ee --- /dev/null +++ b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/querier.go @@ -0,0 +1,16 @@ +// Code generated by sqlc. DO NOT EDIT. + +package querytest + +import ( + "context" + "database/sql" +) + +type Querier interface { + GetAll(ctx context.Context) ([]*Foo, error) + GetAllAByB(ctx context.Context, b sql.NullInt32) ([]sql.NullInt32, error) + GetOne(ctx context.Context, arg *GetOneParams) (*Foo, error) +} + +var _ Querier = (*Queries)(nil) diff --git a/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/query.sql.go b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/query.sql.go new file mode 100644 index 0000000000..033123f1eb --- /dev/null +++ b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/go/query.sql.go @@ -0,0 +1,79 @@ +// Code generated by sqlc. DO NOT EDIT. +// source: query.sql + +package querytest + +import ( + "context" + "database/sql" +) + +const getAll = `-- name: GetAll :many +SELECT a, b FROM foo +` + +func (q *Queries) GetAll(ctx context.Context) ([]*Foo, error) { + rows, err := q.db.QueryContext(ctx, getAll) + if err != nil { + return nil, err + } + defer rows.Close() + var items []*Foo + for rows.Next() { + var i Foo + if err := rows.Scan(&i.A, &i.B); err != nil { + return nil, err + } + items = append(items, &i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getAllAByB = `-- name: GetAllAByB :many +SELECT a FROM foo WHERE b = ? +` + +func (q *Queries) GetAllAByB(ctx context.Context, b sql.NullInt32) ([]sql.NullInt32, error) { + rows, err := q.db.QueryContext(ctx, getAllAByB, b) + if err != nil { + return nil, err + } + defer rows.Close() + var items []sql.NullInt32 + for rows.Next() { + var a sql.NullInt32 + if err := rows.Scan(&a); err != nil { + return nil, err + } + items = append(items, a) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + +const getOne = `-- name: GetOne :one +SELECT a, b FROM foo WHERE a = ? AND b = ? LIMIT 1 +` + +type GetOneParams struct { + A sql.NullInt32 + B sql.NullInt32 +} + +func (q *Queries) GetOne(ctx context.Context, arg *GetOneParams) (*Foo, error) { + row := q.db.QueryRowContext(ctx, getOne, arg.A, arg.B) + var i Foo + err := row.Scan(&i.A, &i.B) + return &i, err +} diff --git a/internal/endtoend/testdata/emit_result_and_params_struct_pointers/query.sql b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/query.sql new file mode 100644 index 0000000000..53bbf19f94 --- /dev/null +++ b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/query.sql @@ -0,0 +1,10 @@ +CREATE TABLE foo (a integer, b integer); + +/* name: GetOne :one */ +SELECT * FROM foo WHERE a = ? AND b = ? LIMIT 1; + +/* name: GetAll :many */ +SELECT * FROM foo; + +/* name: GetAllAByB :many */ +SELECT a FROM foo WHERE b = ?; diff --git a/internal/endtoend/testdata/emit_result_and_params_struct_pointers/sqlc.json b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/sqlc.json new file mode 100644 index 0000000000..5bd5791999 --- /dev/null +++ b/internal/endtoend/testdata/emit_result_and_params_struct_pointers/sqlc.json @@ -0,0 +1,15 @@ +{ + "version": "1", + "packages": [ + { + "name": "querytest", + "path": "go", + "schema": "query.sql", + "queries": "query.sql", + "engine": "mysql", + "emit_interface": true, + "emit_result_struct_pointers": true, + "emit_params_struct_pointers": true + } + ] +}