英文:
Querying for multiple columns with Gorm
问题
你的代码中出现了扫描错误,错误信息显示目标不是一个指针。这个错误是因为你传递给.Scan()
方法的参数类型不正确。.Scan()
方法需要传递指向目标变量的指针,而你传递的是一个二维字符串切片。你可以尝试修改代码,将modelNames
声明为一个结构体切片,然后使用结构体的字段来存储查询结果。
修改后的代码如下所示:
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
}
这样修改后,查询结果将会存储在modelNames
切片中,每个元素都是一个ModelName
结构体,包含model_package
和model_variant
字段的值。
英文:
My db includes the following columns, "model_package" and "model_variant". I try to query the db with Gorm by specifying both of these columns inside .Select(), however, I keep getting a scan error. Normally, when I select a single column (i.e. .Select("model_package")
), it returns to an array(slice) containing all the values, so I assumed it should return to a two-dimension array(slice) when I select multiple columns like in my code below.
My goal is to combine both fields into a string. For example, if a row in db has the following values "model_package" : "pkg1" and "model_variant" : "var1", then I want to create this string "pkg1_var1". How can I construct the correct query to get both values for each row on the db.
My code:
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
}
Error:
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
得分: 2
你可以尝试以下几个选项:
选项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
}
英文:
A couple of options you can try out:
Option 1 - create a view model for your SELECT query and return that to do with it what you want.
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
}
Option 2 - do the concatenation with the CONCAT()
function within your SELECT query.
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
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论