Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
feat(golang): support custom enum type slices for pgx/v5
  • Loading branch information
toqueteos committed Jul 31, 2023
commit 8d49158e2e3b45dbef9376c959e60a6f15190d9b
2 changes: 1 addition & 1 deletion examples/batch/postgresql/db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
)

func TestBatchBooks(t *testing.T) {
db, cleanup := sqltest.PostgreSQLPgx(t, []string{"schema.sql"})
db, cleanup := sqltest.PostgreSQLPgxV4(t, []string{"schema.sql"})
defer cleanup()

ctx := context.Background()
Expand Down
32 changes: 32 additions & 0 deletions examples/enums/postgresql/db.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 57 additions & 0 deletions examples/enums/postgresql/db_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
//go:build examples
// +build examples

package enums

import (
"context"
"testing"

"github.com/sqlc-dev/sqlc/internal/sqltest"
)

func TestUsers(t *testing.T) {
sdb, cleanup := sqltest.PostgreSQLPgxV5(t, []string{"schema.sql", "fixtures.sql"})
defer cleanup()

ctx := context.Background()
db := New(sdb)

for _, name := range EnumNames {
enumType, err := sdb.LoadType(ctx, name) // register enum
if err != nil {
t.Fatal(err)
}
sdb.TypeMap().RegisterType(enumType)

enumType, err = sdb.LoadType(ctx, "_"+name) // register slice of enum
if err != nil {
t.Fatal(err)
}
sdb.TypeMap().RegisterType(enumType)
}

err := db.UserCreate(ctx, UserCreateParams{
FirstName: "Alex",
LastName: "Brown",
Age: 25,
ShirtSize: SizeMedium,
})
if err != nil {
t.Fatal(err)
}

// list all users
users, err := db.ListUsers(ctx)
if err != nil {
t.Fatal(err)
}
t.Log(users)

// list users with large shirt_size
usersWithLarge, err := db.ListUsersByShirtSizes(ctx, []Size{SizeLarge})
if err != nil {
t.Fatal(err)
}
t.Log(usersWithLarge)
}
4 changes: 4 additions & 0 deletions examples/enums/postgresql/fixtures.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
INSERT INTO users (first_name, last_name, age, shirt_size)
VALUES ('John', 'Doe', 42, 'large'),
('Dirk', 'Sample', 23, 'large'),
('Susan', 'Foo', 19, 'small');
67 changes: 67 additions & 0 deletions examples/enums/postgresql/models.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions examples/enums/postgresql/querier.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions examples/enums/postgresql/query.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-- name: UserCreate :exec
INSERT INTO users (first_name, last_name, age, shirt_size)
VALUES ($1, $2, $3, $4);

-- name: ListUsers :many
SELECT * FROM users;

-- name: ListUsersByShirtSizes :many
SELECT * FROM users
WHERE shirt_size = ANY(@shirt_size::size[]);
93 changes: 93 additions & 0 deletions examples/enums/postgresql/query.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions examples/enums/postgresql/schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
CREATE TYPE size AS ENUM('x-small', 'small', 'medium', 'large', 'x-large');

CREATE TABLE users (
id bigint NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
first_name text NOT NULL,
last_name text NOT NULL,
age integer NOT NULL,
shirt_size size NOT NULL
);
22 changes: 22 additions & 0 deletions examples/enums/sqlc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"version": "1",
"packages": [
{
"path": "postgresql",
"name": "enums",
"schema": "postgresql/schema.sql",
"queries": "postgresql/query.sql",
"engine": "postgresql",
"database": {
"uri": "postgresql://${PG_USER}:${PG_PASSWORD}@${PG_HOST}:${PG_PORT}/enums"
},
"rules": [
"sqlc/db-prepare"
],
"sql_package": "pgx/v5",
"emit_json_tags": true,
"emit_prepared_queries": true,
"emit_interface": true
}
]
}
1 change: 1 addition & 0 deletions internal/codegen/golang/enum.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ type Constant struct {

type Enum struct {
Name string
TypeName string
Comment string
Constants []Constant
NameTags map[string]string
Expand Down
1 change: 1 addition & 0 deletions internal/codegen/golang/result.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ func buildEnums(req *plugin.CodeGenRequest) []Enum {

e := Enum{
Name: StructName(enumName, req.Settings),
TypeName: enum.Name,
Comment: enum.Comment,
NameTags: map[string]string{},
ValidTags: map[string]string{},
Expand Down
6 changes: 6 additions & 0 deletions internal/codegen/golang/templates/template.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,12 @@ func All{{ .Name }}Values() []{{ .Name }} {
{{ end }}
{{end}}

{{if and (gt (len .Enums) 0) (eq $.SQLDriver.Package "pgx/v5") }}
var EnumNames = []string{
{{range .Enums}}{{printf "%q" .TypeName}},{{end}}
}
{{end}}

{{range .Structs}}
{{if .Comment}}{{comment .Comment}}{{end}}
type {{.Name}} struct { {{- range .Fields}}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading