sqlc icon indicating copy to clipboard operation
sqlc copied to clipboard

Support `sql.Null`

Open kyleconroy opened this issue 1 year ago • 2 comments

What do you want to change?

Go 1.22 includes a generic Null type.

type Null[T [any](https://pkg.go.dev/builtin#any)] struct {
	V     T
	Valid [bool](https://pkg.go.dev/builtin#bool)
}

Null represents a value that may be null. Null implements the Scanner interface so it can be used as a scan destination:

var s Null[string]
err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s)
...
if s.Valid {
   // use s.V
} else {
   // NULL value
}

This would make our lives much easier when generating code

What database engines need to be changed?

No response

What programming language backends need to be changed?

No response

kyleconroy avatar Jan 18 '24 16:01 kyleconroy

What if you could configure any generic type to wrap nulls? Something like:

go:
  ...
  generic_null_type:
    import: "my/custom/null"
    type: "Null"
  ...

and then a nullable string column would be generated as null.Null[string].

Use case: sql.Null doesn't appear to have good JSON marshaling, it would be nice to be able to choose an option that does.

This is kind of doable currently by overriding every single nullable type individually in the config.

gregoryjjb avatar Jan 20 '24 18:01 gregoryjjb

Put together an implementation of my above suggestion in #3202

gregoryjjb avatar Feb 14 '24 23:02 gregoryjjb