Open ivoras opened 7 months ago
Hi @ivoras !
nullzero
in the bun
tag only controls how the value is appended to the query, so this should work:
withNil := S{D: nil}
db.NewInsert().Model(&withNil).Exec(ctx)
Scanning, on the other hand, is controlled by how (and if) the given type implements sql.Scanner
interface.
If we check the timex.Date
implementation:
func (d *Date) Scan(value interface{}) (err error) {
switch v := value.(type) {
case []byte:
*d, err = ParseDate(RFC3339, string(v))
case string:
*d, err = ParseDate(RFC3339, v)
case time.Time:
*d = DateFromTime(v)
default:
err = fmt.Errorf("unsupported type %T", value)
}
return err
}
the last part of the wrapped error message seems to come directly from here -- timex.Date
does not support scanning NULL
values.
unsupported type nil
What do you do about it?
You can wrap timex.Date
and add the missing functionality:
package ivorastime
type Date struct {
timex.Date
}
func (d *Date) Scan(value interface{}) (err error) {
if value != nil {
return d.Date.Scan(value)
}
// Optionally, since ivorastime.Date will initialize with zero timex.Date anyways:
// d.Date = timex.Date{}
return nil
}
bun.NullTime
does the same for the standard time.Time
and you can use it as a reference:
P.S.: specifying the language for your code snippets will add syntax highlighting:
"```go"
instead of
"```"
I'm using timex.Date (https://github.com/invzhi/timex) to work with DATE fields in PostgreSQL, and I'm receiving en error when I try to load a null Date field (with the intent of it being loaded as the zero value in Go).
script:
The error produced is:
I'm not sure if it's a problem in Bun or in the timex.Date implementation, but it looks like a bug, especially since I have the
nullzero
annotation on the Date field.