查询空字段时如何设置pgtype.Null为默认值?

问题描述 投票:0回答:1

我正在 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字段自动具有空字段的空状态。我该怎么做?

postgresql go go-gorm
1个回答
0
投票

加载数据时可以使用 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

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.