使用 Gorm 查询多列

Querying for multiple columns with Gorm

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

我的目标是将两个字段组合成一个字符串。例如,如果数据库中的一行具有以下值“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

您可以尝试几个选项:

选项 1 - 为您的 SELECT 查询创建一个视图模型,然后 return 根据您的需要对其进行处理。

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
}