2016-01-01 33 views
0

我试图建立一个查询如下,在这里我使用gorp。为选择查询传递可变参数

func GetAgregatedDownloadsFromTo(constrains Constrains) [] dao.NameValue { 
    dbMap := utils.GetDBConnection("radsummary"); 
    defer dbMap.Db.Close() 
    var totalDailyDownloads[] NameValue 
    query := "SELECT SUM(outputoctets) as value ,date as name FROM dailyacct where date >= ? AND date < ? " 

    if len(constrains.LocationGroups) > 0 { 
     query = query + " AND calledstationid=? " 
     for i := 1; i< len(constrains.LocationGroups); i++ { 
      query = query + " OR calledstationid=? " 
     } 
     query = query + " group by date" 
     print(query) 
     _, err := dbMap.Select(&totalDailyDownloads, query, constrains.From, constrains.To, constrains.LocationGroups...) 
     if err != nil { 
      panic(err.Error()) // proper error handling instead of panic 
     } 
    } 
    return totalDailyDownloads 
} 

type Constrains struct { 
    From string `json:"from"` 
    To string `json:"to"` 
    LocationGroups []string `json:"locationgroups"` 
} 

查询构造基于constrains.LocationGroups的长度发生。我遇到的麻烦是将可变数量的参数传递给Select查询,一旦我给了constrains.LocationGroups ...作为选择查询参数,它会引发编译器错误too many arguments in call to dbMap.Select

是否有可能实现这种要求?感谢您的意见。

回答

0

发现基于Pass string slice to variadic empty interface parameter

答案下面是更新后的代码来实现任务

func GetAgregatedDownloadsFromTo(constrains dao.Constrains) [] dao.NameValue { 
    dbMap := utils.GetDBConnection("radsummary"); 
    defer dbMap.Db.Close() 
    var totalDailyDownloads[] dao.NameValue 
    query := "SELECT SUM(outputoctets) as value ,date as name FROM dailyacct where date >= ? AND date < ? " 

    if len(constrains.LocationGroups) > 0 { 
     args := make([]interface{}, len(constrains.LocationGroups)+2) 
     args[0] = constrains.From 
     args[1] = constrains.To 
     for index, value := range constrains.LocationGroups { args[index+2] = value } 

     query = query + " AND calledstationid=? " 
     for i := 1; i< len(constrains.LocationGroups); i++ { 
      query = query + " OR calledstationid=? " 
     } 
     query = query + " group by date" 
     print(query) 
     _, err := dbMap.Select(&totalDailyDownloads, query, args...) 
     if err != nil { 
      panic(err.Error()) // proper error handling instead of panic 
     } 
    } 
    return totalDailyDownloads 
} 

在这里,我不得不串片转换为界面片。