SQL NULL and Go zero values¶
Go zero values¶
By default all columns except primary keys are nullable and go-pg marshals Go zero values (empty string, 0, zero time, nil map, and nil slice) as SQL NULL. You can disable this behavior with pg:",use_zero"tag.
For insert queries you can also specify a default value for a column using pg:"default:now()" tag. In this case go-pg uses DEFAULT instead of NULL so PostgreSQL can generate a default value when it encounters DEFAULT.
Modeling NULL values¶
To represent SQL NULL, you can use pointers or sql.Null* types:
type Item struct {
Active *bool
// or
Active sql.NullBool
}
For example:
(*bool)(nil)andsql.NullBool{}representNULL.(*bool)(false)andsql.NullBool{Valid: true}representFALSE.(*bool)(true)andsql.NullBool{Valid: true, Value: true}representTRUE.
Updating specific columns¶
To update list of key-value pairs:
kv := map[string]interface{}{
"col1": "val1",
"col2": 123,
}
db.Model(&kv).TableExpr("items").Update()
To update subset of columns on a struct:
db.Model(&item).Column("col1", "col2").Update()
To update non-zero struct fields:
db.Model(&item).WherePK().UpdateNotZero()