From 53c71b8f5ab55327519e7fe69b5f825bf86883bc Mon Sep 17 00:00:00 2001 From: xeoncross Date: Fri, 11 Mar 2022 17:23:32 -0600 Subject: [PATCH 1/2] adding :execlastinsertid for golang --- docs/reference/query-annotations.md | 18 +++++++++++++++ .../golang/templates/pgx/interfaceCode.tmpl | 9 ++++++++ .../golang/templates/pgx/queryCode.tmpl | 17 ++++++++++++++ .../templates/stdlib/interfaceCode.tmpl | 9 ++++++++ .../golang/templates/stdlib/queryCode.tmpl | 22 ++++++++++++++++++ internal/metadata/meta.go | 23 ++++++++++--------- 6 files changed, 87 insertions(+), 11 deletions(-) diff --git a/docs/reference/query-annotations.md b/docs/reference/query-annotations.md index cb0b299310..9cf7a2e36b 100644 --- a/docs/reference/query-annotations.md +++ b/docs/reference/query-annotations.md @@ -59,6 +59,24 @@ func (q *Queries) DeleteAllAuthors(ctx context.Context) (int64, error) { } ``` +## `:execlastinsertid` + +The generated method will return the number generated by the database from the +[result](https://golang.org/pkg/database/sql/#Result) returned by +[ExecContext](https://golang.org/pkg/database/sql/#DB.ExecContext). + +```sql +-- name: InsertAuthor :execlastinsertid +INSERT INTO authors (name) VALUES (?); +``` + +```go +func (q *Queries) InsertAuthor(ctx context.Context, name string) (int64, error) { + _, err := q.db.ExecContext(ctx, insertAuthor, name) + // ... +} +``` + ## `:many` The generated method will return a slice of records via diff --git a/internal/codegen/golang/templates/pgx/interfaceCode.tmpl b/internal/codegen/golang/templates/pgx/interfaceCode.tmpl index cf7cd36cb9..3712bcd8a7 100644 --- a/internal/codegen/golang/templates/pgx/interfaceCode.tmpl +++ b/internal/codegen/golang/templates/pgx/interfaceCode.tmpl @@ -38,6 +38,15 @@ {{end -}} {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) {{- end}} + {{- if and (eq .Cmd ":execlastinsertid") ($dbtxParam) }} + {{range .Comments}}//{{.}} + {{end -}} + {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) (int64, error) + {{- else if eq .Cmd ":execlastinsertid" }} + {{range .Comments}}//{{.}} + {{end -}} + {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) + {{- end}} {{- if and (eq .Cmd ":execresult") ($dbtxParam) }} {{range .Comments}}//{{.}} {{end -}} diff --git a/internal/codegen/golang/templates/pgx/queryCode.tmpl b/internal/codegen/golang/templates/pgx/queryCode.tmpl index 230844a58b..a05a0ca892 100644 --- a/internal/codegen/golang/templates/pgx/queryCode.tmpl +++ b/internal/codegen/golang/templates/pgx/queryCode.tmpl @@ -103,6 +103,23 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, er } {{end}} +{{if eq .Cmd ":execlastinsertid"}} +{{range .Comments}}//{{.}} +{{end -}} +{{if $.EmitMethodsWithDBArgument -}} +func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) (int64, error) { + result, err := db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}}) +{{- else -}} +func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) { + result, err := q.db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}}) +{{- end}} + if err != nil { + return 0, err + } + return result.LastInsertId(), nil +} +{{end}} + {{if eq .Cmd ":execresult"}} {{range .Comments}}//{{.}} {{end -}} diff --git a/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl b/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl index 3b59479801..bc2759f8ac 100644 --- a/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl +++ b/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl @@ -38,6 +38,15 @@ {{end -}} {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) {{- end}} + {{- if and (eq .Cmd ":execlastinsertid") ($dbtxParam) }} + {{range .Comments}}//{{.}} + {{end -}} + {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) (int64, error) + {{- else if eq .Cmd ":execlastinsertid"}} + {{range .Comments}}//{{.}} + {{end -}} + {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) + {{- end}} {{- if and (eq .Cmd ":execresult") ($dbtxParam) }} {{range .Comments}}//{{.}} {{end -}} diff --git a/internal/codegen/golang/templates/stdlib/queryCode.tmpl b/internal/codegen/golang/templates/stdlib/queryCode.tmpl index 421cf7958f..a1ca4a0d5d 100644 --- a/internal/codegen/golang/templates/stdlib/queryCode.tmpl +++ b/internal/codegen/golang/templates/stdlib/queryCode.tmpl @@ -124,6 +124,28 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, er } {{end}} +{{if eq .Cmd ":execlastinsertid"}} +{{range .Comments}}//{{.}} +{{end -}} +{{- if $.EmitMethodsWithDBArgument -}} +func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) (int64, error) { +{{- else -}} +func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) { +{{- end -}} + {{- if $.EmitPreparedQueries}} + result, err := q.exec(ctx, q.{{.FieldName}}, {{.ConstantName}}, {{.Arg.Params}}) + {{- else if $.EmitMethodsWithDBArgument}} + result, err := db.ExecContext(ctx, {{.ConstantName}}, {{.Arg.Params}}) + {{- else}} + result, err := q.db.ExecContext(ctx, {{.ConstantName}}, {{.Arg.Params}}) + {{- end}} + if err != nil { + return 0, err + } + return result.LastInsertId() +} +{{end}} + {{if eq .Cmd ":execresult"}} {{range .Comments}}//{{.}} {{end -}} diff --git a/internal/metadata/meta.go b/internal/metadata/meta.go index 67a9e351c9..12d78cfca2 100644 --- a/internal/metadata/meta.go +++ b/internal/metadata/meta.go @@ -13,15 +13,16 @@ type CommentSyntax struct { } const ( - CmdExec = ":exec" - CmdExecResult = ":execresult" - CmdExecRows = ":execrows" - CmdMany = ":many" - CmdOne = ":one" - CmdCopyFrom = ":copyfrom" - CmdBatchExec = ":batchexec" - CmdBatchMany = ":batchmany" - CmdBatchOne = ":batchone" + CmdExec = ":exec" + CmdExecResult = ":execresult" + CmdExecRows = ":execrows" + CmdExecLastInsertId = ":execlastinsertid" + CmdMany = ":many" + CmdOne = ":one" + CmdCopyFrom = ":copyfrom" + CmdBatchExec = ":batchexec" + CmdBatchMany = ":batchmany" + CmdBatchOne = ":batchone" ) // A query name must be a valid Go identifier @@ -83,7 +84,7 @@ func Parse(t string, commentStyle CommentSyntax) (string, string, error) { part = part[:len(part)-1] // removes the trailing "*/" element } if len(part) == 2 { - return "", "", fmt.Errorf("missing query type [':one', ':many', ':exec', ':execrows', ':execresult', ':copyfrom', 'batchexec', 'batchmany', 'batchone']: %s", line) + return "", "", fmt.Errorf("missing query type [':one', ':many', ':exec', ':execrows', ':execlastinsertid', ':execresult', ':copyfrom', 'batchexec', 'batchmany', 'batchone']: %s", line) } if len(part) != 4 { return "", "", fmt.Errorf("invalid query comment: %s", line) @@ -91,7 +92,7 @@ func Parse(t string, commentStyle CommentSyntax) (string, string, error) { queryName := part[2] queryType := strings.TrimSpace(part[3]) switch queryType { - case CmdOne, CmdMany, CmdExec, CmdExecResult, CmdExecRows, CmdCopyFrom, CmdBatchExec, CmdBatchMany, CmdBatchOne: + case CmdOne, CmdMany, CmdExec, CmdExecResult, CmdExecRows, CmdExecLastInsertId, CmdCopyFrom, CmdBatchExec, CmdBatchMany, CmdBatchOne: default: return "", "", fmt.Errorf("invalid query type: %s", queryType) } From 918c9eaabb3a5feb44fc2233b93dc1517c355a14 Mon Sep 17 00:00:00 2001 From: xeoncross Date: Sat, 19 Mar 2022 17:15:55 -0500 Subject: [PATCH 2/2] updated to :execlastid --- docs/reference/query-annotations.md | 4 +-- .../golang/templates/pgx/interfaceCode.tmpl | 9 ------ .../golang/templates/pgx/queryCode.tmpl | 17 ----------- .../templates/stdlib/interfaceCode.tmpl | 4 +-- .../golang/templates/stdlib/queryCode.tmpl | 2 +- .../exec_lastid/go_postgresql_stdlib/go/db.go | 29 +++++++++++++++++++ .../go_postgresql_stdlib/go/models.go | 9 ++++++ .../go_postgresql_stdlib/go/querier.go | 13 +++++++++ .../go_postgresql_stdlib/go/query.sql.go | 20 +++++++++++++ .../go_postgresql_stdlib/query.sql | 4 +++ .../go_postgresql_stdlib/sqlc.json | 13 +++++++++ internal/metadata/meta.go | 24 +++++++-------- 12 files changed, 105 insertions(+), 43 deletions(-) create mode 100644 internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/db.go create mode 100644 internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/models.go create mode 100644 internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/querier.go create mode 100644 internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/query.sql.go create mode 100644 internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/query.sql create mode 100644 internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/sqlc.json diff --git a/docs/reference/query-annotations.md b/docs/reference/query-annotations.md index 9cf7a2e36b..024737594d 100644 --- a/docs/reference/query-annotations.md +++ b/docs/reference/query-annotations.md @@ -59,14 +59,14 @@ func (q *Queries) DeleteAllAuthors(ctx context.Context) (int64, error) { } ``` -## `:execlastinsertid` +## `:execlastid` The generated method will return the number generated by the database from the [result](https://golang.org/pkg/database/sql/#Result) returned by [ExecContext](https://golang.org/pkg/database/sql/#DB.ExecContext). ```sql --- name: InsertAuthor :execlastinsertid +-- name: InsertAuthor :execlastid INSERT INTO authors (name) VALUES (?); ``` diff --git a/internal/codegen/golang/templates/pgx/interfaceCode.tmpl b/internal/codegen/golang/templates/pgx/interfaceCode.tmpl index 3712bcd8a7..cf7cd36cb9 100644 --- a/internal/codegen/golang/templates/pgx/interfaceCode.tmpl +++ b/internal/codegen/golang/templates/pgx/interfaceCode.tmpl @@ -38,15 +38,6 @@ {{end -}} {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) {{- end}} - {{- if and (eq .Cmd ":execlastinsertid") ($dbtxParam) }} - {{range .Comments}}//{{.}} - {{end -}} - {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) (int64, error) - {{- else if eq .Cmd ":execlastinsertid" }} - {{range .Comments}}//{{.}} - {{end -}} - {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) - {{- end}} {{- if and (eq .Cmd ":execresult") ($dbtxParam) }} {{range .Comments}}//{{.}} {{end -}} diff --git a/internal/codegen/golang/templates/pgx/queryCode.tmpl b/internal/codegen/golang/templates/pgx/queryCode.tmpl index a05a0ca892..230844a58b 100644 --- a/internal/codegen/golang/templates/pgx/queryCode.tmpl +++ b/internal/codegen/golang/templates/pgx/queryCode.tmpl @@ -103,23 +103,6 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, er } {{end}} -{{if eq .Cmd ":execlastinsertid"}} -{{range .Comments}}//{{.}} -{{end -}} -{{if $.EmitMethodsWithDBArgument -}} -func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) (int64, error) { - result, err := db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}}) -{{- else -}} -func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) { - result, err := q.db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}}) -{{- end}} - if err != nil { - return 0, err - } - return result.LastInsertId(), nil -} -{{end}} - {{if eq .Cmd ":execresult"}} {{range .Comments}}//{{.}} {{end -}} diff --git a/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl b/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl index bc2759f8ac..3cbefe6df4 100644 --- a/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl +++ b/internal/codegen/golang/templates/stdlib/interfaceCode.tmpl @@ -38,11 +38,11 @@ {{end -}} {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) {{- end}} - {{- if and (eq .Cmd ":execlastinsertid") ($dbtxParam) }} + {{- if and (eq .Cmd ":execlastid") ($dbtxParam) }} {{range .Comments}}//{{.}} {{end -}} {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) (int64, error) - {{- else if eq .Cmd ":execlastinsertid"}} + {{- else if eq .Cmd ":execlastid"}} {{range .Comments}}//{{.}} {{end -}} {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, error) diff --git a/internal/codegen/golang/templates/stdlib/queryCode.tmpl b/internal/codegen/golang/templates/stdlib/queryCode.tmpl index a1ca4a0d5d..f496d8959e 100644 --- a/internal/codegen/golang/templates/stdlib/queryCode.tmpl +++ b/internal/codegen/golang/templates/stdlib/queryCode.tmpl @@ -124,7 +124,7 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, er } {{end}} -{{if eq .Cmd ":execlastinsertid"}} +{{if eq .Cmd ":execlastid"}} {{range .Comments}}//{{.}} {{end -}} {{- if $.EmitMethodsWithDBArgument -}} diff --git a/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/db.go b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/db.go new file mode 100644 index 0000000000..6a99519302 --- /dev/null +++ b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/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/exec_lastid/go_postgresql_stdlib/go/models.go b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/models.go new file mode 100644 index 0000000000..7c3b98644d --- /dev/null +++ b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/models.go @@ -0,0 +1,9 @@ +// Code generated by sqlc. DO NOT EDIT. + +package querytest + +import () + +type Bar struct { + ID int32 +} diff --git a/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/querier.go b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/querier.go new file mode 100644 index 0000000000..5c125e409e --- /dev/null +++ b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/querier.go @@ -0,0 +1,13 @@ +// Code generated by sqlc. DO NOT EDIT. + +package querytest + +import ( + "context" +) + +type Querier interface { + InsertBar(ctx context.Context) (int64, error) +} + +var _ Querier = (*Queries)(nil) diff --git a/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/query.sql.go b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/query.sql.go new file mode 100644 index 0000000000..fd0d1ed903 --- /dev/null +++ b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/go/query.sql.go @@ -0,0 +1,20 @@ +// Code generated by sqlc. DO NOT EDIT. +// source: query.sql + +package querytest + +import ( + "context" +) + +const insertBar = `-- name: InsertBar :execlastid +INSERT INTO bar () VALUES () +` + +func (q *Queries) InsertBar(ctx context.Context) (int64, error) { + result, err := q.db.ExecContext(ctx, insertBar) + if err != nil { + return 0, err + } + return result.LastInsertId() +} diff --git a/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/query.sql b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/query.sql new file mode 100644 index 0000000000..a8203f0a78 --- /dev/null +++ b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/query.sql @@ -0,0 +1,4 @@ +CREATE TABLE bar (id integer(10) NOT NULL AUTO_INCREMENT PRIMARY KEY); + +-- name: InsertBar :execlastid +INSERT INTO bar () VALUES (); \ No newline at end of file diff --git a/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/sqlc.json b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/sqlc.json new file mode 100644 index 0000000000..b199a32720 --- /dev/null +++ b/internal/endtoend/testdata/exec_lastid/go_postgresql_stdlib/sqlc.json @@ -0,0 +1,13 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "name": "querytest", + "engine": "mysql", + "schema": "query.sql", + "queries": "query.sql", + "emit_interface": true + } + ] +} \ No newline at end of file diff --git a/internal/metadata/meta.go b/internal/metadata/meta.go index 12d78cfca2..59a1add763 100644 --- a/internal/metadata/meta.go +++ b/internal/metadata/meta.go @@ -13,16 +13,16 @@ type CommentSyntax struct { } const ( - CmdExec = ":exec" - CmdExecResult = ":execresult" - CmdExecRows = ":execrows" - CmdExecLastInsertId = ":execlastinsertid" - CmdMany = ":many" - CmdOne = ":one" - CmdCopyFrom = ":copyfrom" - CmdBatchExec = ":batchexec" - CmdBatchMany = ":batchmany" - CmdBatchOne = ":batchone" + CmdExec = ":exec" + CmdExecResult = ":execresult" + CmdExecRows = ":execrows" + CmdExecLastId = ":execlastid" + CmdMany = ":many" + CmdOne = ":one" + CmdCopyFrom = ":copyfrom" + CmdBatchExec = ":batchexec" + CmdBatchMany = ":batchmany" + CmdBatchOne = ":batchone" ) // A query name must be a valid Go identifier @@ -84,7 +84,7 @@ func Parse(t string, commentStyle CommentSyntax) (string, string, error) { part = part[:len(part)-1] // removes the trailing "*/" element } if len(part) == 2 { - return "", "", fmt.Errorf("missing query type [':one', ':many', ':exec', ':execrows', ':execlastinsertid', ':execresult', ':copyfrom', 'batchexec', 'batchmany', 'batchone']: %s", line) + return "", "", fmt.Errorf("missing query type [':one', ':many', ':exec', ':execrows', ':execlastid', ':execresult', ':copyfrom', 'batchexec', 'batchmany', 'batchone']: %s", line) } if len(part) != 4 { return "", "", fmt.Errorf("invalid query comment: %s", line) @@ -92,7 +92,7 @@ func Parse(t string, commentStyle CommentSyntax) (string, string, error) { queryName := part[2] queryType := strings.TrimSpace(part[3]) switch queryType { - case CmdOne, CmdMany, CmdExec, CmdExecResult, CmdExecRows, CmdExecLastInsertId, CmdCopyFrom, CmdBatchExec, CmdBatchMany, CmdBatchOne: + case CmdOne, CmdMany, CmdExec, CmdExecResult, CmdExecRows, CmdExecLastId, CmdCopyFrom, CmdBatchExec, CmdBatchMany, CmdBatchOne: default: return "", "", fmt.Errorf("invalid query type: %s", queryType) }