使用 go-pg 从 Postgres 中检索虚拟列

Using go-pg to retrieve virtual columns from Postgres

我正在使用 go-pg (https://github.com/go-pg/pg) 和此代码:

type Book struct {
  id   int
  name string
}

var books []Book
err := db.Model(&books).Select()

一切正常,但我需要像这样添加一个 "virtual" 列:

concat ('info:', 'id:', id, '...') AS info

我尝试使用:

query.ColumnExpr("concat ('info:', 'id:', id, '...') AS info")

但是:

  1. go-pg 抱怨:error="pg: can't find column=info in model=Book (try discard_unknown_columns)"

  2. go-pg 在查询中不再包含 idname 列:仅 concat...

我能理解,因为现在 go-pg 不知道如何绑定数据,但我真的需要那个只能从数据库中检索的字符串。

有办法吗?

我可以使用像下面这样的自定义类型吗?

type CustomBook struct {
  Info string
  Book
}

这有意义吗?

这种方法可能适合你:

type Book struct {
  ID   int
  Name string
  Info string `pg:"-"`
}

...
db.Model(&books).ColumnExpr("book.*").ColumnExpr("CONCAT('id:', id, 'name:', name) AS info").Select()

pg:"-" 忽略结构字段,它不会被创建,也不会产生任何错误

此处记录了这个被忽略的列:https://pg.uptrace.dev/models/

另一种方法,根据您的要求可能是这样的:

var r []struct {
  Name string
  Info string
}

db.Model((*Book)(nil)).Column("name").ColumnExpr("CONCAT('id:', id, 'name:', name) AS info").Select(&r)

第二个记录在此处:https://pg.uptrace.dev/queries/