我在Golang中使用Gorm处理postgresql db.我使用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的null字段将被转换为零值,也就是说,它的状态是Undefined.

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},
  }
  */
}

这里,用于保存在DB中的gorm struct 体与从DB加载的gorm struct 体不同是不自然的.

此外,当我修改 struct 的某些字段并再次保存时,由于状态为undefined而出现错误.

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
}

因此,当我从数据库加载带有null字段的数据时,我希望使pgtype字段自动具有null字段的null状态.我该怎么办?

推荐答案

您可以使用BeforeCreate钩子设置字段的默认值.

try

func (person *Person) BeforeCreate(_ *gorm.DB) error {
    if person.Nickname.Status == pgtype.Undefined {
        person.Nickname.Status = pgtype.Null
    }
    return nil
}

This will check the pgtype field is Undefined and set that as Null for Person struct before creating the entry in the database. And you will be able to omit the Nickname field while creating

john := &Person{
    ID:  "John",
    Age: 30,
}
DB.Create(john) // ID: John, Age: 30, Nickname: NULL    

同样,您可以使用AfterFind钩子来更新生成的响应字段,

func (person *Person) AfterFind(_ *gorm.DB) error {
    if person.Nickname.Status == pgtype.Undefined {
        person.Nickname.Status = pgtype.Null
    }
    return nil
}

希望这有帮助

Postgresql相关问答推荐

计算两个子查询之间的差异

是否从表中 Select 值?巴什

自左联接的POSTGIS更新

Postgres从spark触发post-write

尽管违反了部分索引约束,Postgres 插入仍在发生

如何使用 PostgreSQL 数据库中的函数和存储过程从动态表中获取所有数据?参数传入的表名

postgres 中的模式前缀,被调用元素的范围

Java - 日期保存为前一天

Heroku PGError:operator does not exist: character varying = integer

为什么 PostgreSQL 将用户和组合并为角色?

如何确定 NULL 是否包含在 Postgres 的数组中?

从 PostgreSQL 中的时间戳获取日期

manage.py 迁移时必须是关系 django_site 的所有者

SQL:多次重复结果行,并对行进行编号

如何语法判断 PostgreSQL 配置文件?

在 PostgreSQL 中跳过每 n 个结果行

如何从 CSV 为 PostgreSQL 副本生成模式

在 Postgres 中显示关系、序列和函数的默认访问权限

IF处或附近的 Postgres 语法错误

JOIN (SELECT ... ) ue ON 1=1?