我正在 Golang 中使用 Gorm 处理 postgresql 数据库。我使用 pgtype 包来处理可为空的字段。 要将空值插入字段,我必须将状态设置为 pgtype.null,如下所示。
type Person struct {
ID string
Age int
Nickname pgtype.Text
}
func CreatePerson(){
john := &Person{
ID: "John",
Age: 30,
Nickname: pgtype.Text{Status: pgtype.Null},
}
DB.Create(john) // ID: John, Age: 30, Nickname: NULL
}
但是,当我从数据库加载数据时,pgtypte.Text 的空字段将转换为零值,即其状态为未定义。
func GetPerson(){
john := &Person{}
DB.Where("id = ?", "John").First(john) // ID: John, Nickname: NUL
/* john = {
ID: "John",
Age: 30,
Nickname: pgtype.Text{Status: pgtype.Undefined},
}
*/
}
这里,用于保存在数据库中的 gorm 结构体与从数据库加载的 gorm 结构体不同,这是不自然的。
另外,当我修改结构体的一些字段并再次保存时,由于状态为未定义而出现错误。
func GetAndSave(){
john := &Person{}
DB.Where("id = ?", "John").First(john) // ID: John, Nickname: NUL
/* john = {
ID: "John",
Age: 30,
Nickname: pgtype.Text{Status: pgtype.Undefined},
}
*/
john.Age = 31
DB.Select("*").Update(john) // Error since its nickname has undefined status
}
因此,我希望当我从数据库加载带有空字段的数据时,pgtype字段自动具有空字段的空状态。我该怎么做?
加载数据时可以使用 AfterFind 钩子将字段设置为空。
尝试
func (person *Person) AfterFind(_ *gorm.DB) error {
if person.Nickname.Status == pgtype.Undefined {
person.Nickname.Status = pgtype.Null
}
return nil
}
这将检查 pgtype 字段是否为
Undefined
并将其设置为 Null
结构的 Person
。
希望这有帮助