sqlc-dev / sqlc

Generate type-safe code from SQL
https://sqlc.dev
MIT License
13.51k stars 810 forks source link

Support `sql.Null` #3149

Open kyleconroy opened 10 months ago

kyleconroy commented 10 months ago

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

gregoryjjb commented 10 months ago

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 commented 9 months ago

Put together an implementation of my above suggestion in #3202