这里有一个例子可以说明我的意思:
func (s *Store) UpdateOrganization(entity *Organization) (*Organization, error) {
org := &Organization{}
stmt := `
UPDATE public.organizations
SET name = $1,
website = $2,
image_url = $3
WHERE id = $4
RETURNING *;`
rows, _ := s.db.Query(
context.Background(),
stmt,
entity.Name,
entity.Website,
entity.ImageURL,
entity.ID,
)
if err := pgxscan.ScanOne(org, rows); err != nil {
return nil, newStoreError(err)
}
return org, nil
}
这些字段(name
、website
、image_url
)都不是必需的(补丁更新),因此从UpdateOrganizationDTO
生成的实体可能只有name = "george jungle"
,其他字段(website
、image_url
)为nil
。
我该如何处理这种情况?否则,我会用空值覆盖DB中的现有字段。
我一直在尝试的一件事(WIP,还不确定这是否是一个好方法,特别是当我有更复杂的查询时)是创建一个Mapmap[string]string
,它将非空值Map到它们的列名。
我尝试使用下面注解中提到的条件,现在我想知道如何将值传递给Query()
?
setClauses := []string{}
if entity.Name != nil {
setClauses = append(setClauses, "name = $2")
}
if entity.Website != nil {
setClauses = append(setClauses, "website = $3")
}
if entity.ImageURL != nil {
setClauses = append(setClauses, "image_url = $4")
}
setClause := ""
stmt := fmt.Sprintf(`
UPDATE public.organizations
SET %s
WHERE id = $1
RETURNING *;`, setClause)
rows, _ := s.db.Query(
context.Background(),
stmt,
entity.ID,
////// how to handle these VVVVV
entity.Name,
entity.Website,
entity.ImageURL,
)
2条答案
按热度按时间blmhpbnm1#
我想我成功了......
请告诉我是否有更好的办法
4ktjp1zp2#
您可以执行以下操作:
然而,我个人认为正确的默认方法(例外情况除外)是从数据库中检索完整的对象;然后在Go语言中修改用户提供的字段;然后照原样存储该对象。