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"`
}

クエリの構築は、constraints.LocationGroups の長さに基づいて行われます。私が抱えている問題は、constraints.LocationGroups... を select クエリ パラメータとして指定すると、可変数の引数を Select クエリに渡すことです。コンパイラ エラーがスローされます。too many arguments in call to dbMap.Select

この種の要件を達成することは可能ですか? ご意見をお待ちしております。

4

1 に答える 1

0

Pass string slice to variadic empty interface パラメータに基づいて答えを見つけました

以下は、タスクを達成するための更新されたコードです

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
}

ここでは、文字列スライスをインターフェイス スライスに変換する必要がありました。

于 2016-01-01T01:16:53.310 に答える