【问题标题】:Querying for multiple columns with Gorm使用 Gorm 查询多列
【发布时间】:2021-08-31 13:10:17
【问题描述】:

我的数据库包括以下列“model_package”和“model_variant”。我尝试通过在 .Select() 中指定这两个列来使用 Gorm 查询数据库,但是,我不断收到扫描错误。通常,当我选择一个列(即.Select("model_package"))时,它会返回一个包含所有值的数组(切片),所以我假设当我选择多个列时它应该返回一个二维数组(切片),如下面是我的代码。

我的目标是将两个字段组合成一个字符串。例如,如果 db 中的一行具有以下值“model_package”:“pkg1”和“model_variant”:“var1”,那么我想创建这个字符串“pkg1_var1”。如何构造正确的查询以获取数据库上每一行的两个值。

我的代码:

func (s *store) ListAllModelNames() ([][]string, error) {
    var modelNames [][]string
    result := s.db.Table(mfcTable).Select("model_package", "model_variant").Scan(&modelNames)
    if result.Error != nil {
        return nil, result.Error
    }
    return modelNames, nil
}

错误:

sql: Scan error on column index 0, name "model_package": destination not a pointer; sql: Scan error on column index 0, name "model_package": destination not a pointer; sql: Scan error on column index 0, name "model_package": destination not a pointer; sql: Scan error on column index 0, name "model_package": destination not a pointer; sql: Scan error on column index 0, name "model_package": destination not a pointer; sql: Scan error on column index 0, name "model_package": destination not a pointer; sql: Scan error on column index 0, name "model_package": destination not a pointer; sql: Scan error on column index 0, name "model_package": destination not a pointer

【问题讨论】:

  • 您是否尝试过扫描到结构数组中?或者,您可以在 SQL 中连接 model_packagemodel_variant,生成一个字符串,然后您可以将其扫描到 var modelNames []string

标签: database go go-gorm


【解决方案1】:

您可以尝试几个选项:

选项 1 - 为您的 SELECT 查询创建一个视图模型并将其返回以按照您的意愿使用它。

type ModelName struct {
   ModelPackage string
   ModelVariant string
}

func (s *store) ListAllModelNames() ([]ModelName, error) {
    var modelNames []ModelName
    result := s.db.Table(mfcTable).Select("model_package", "model_variant").Scan(&modelNames)
    if result.Error != nil {
        return nil, result.Error
    }
    return modelNames, nil
}

选项 2 - 在 SELECT 查询中使用 CONCAT() 函数进行连接。

func (s *store) ListAllModelNames() ([]string, error) {
    var modelNames []string
    result := s.db.Table(mfcTable).Select("CONCAT(model_package, "_", model_variant)").Where("model_package IS NOT NULL AND model_variant IS NOT NULL").Scan(&modelNames)
    if result.Error != nil {
        return nil, result.Error
    }
    return modelNames, nil
}

【讨论】:

  • struct(ModelName)的字段是如何连接到查询的?因为,例如,当我将“ModelPackage”字段更改为“Package”时,我再次收到错误。 @emin
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 2011-06-03
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多