golangでmysqlを使ってコードを書いています。
go
1func XXXX(db sql.DB, n int, 2 modifiedBefore *time.Time, 3 tags []string, 4 url string, 5) ([]*ContentsWithAll, error) { 6 7 tagsSql := strings.Repeat("?, ", len(tags)-1) + ` ) ` 8 const sqlstr = `SELECT ` + 9// SELECT部は省略 10 `FROM ` + 11 `((((contents ` + 12 `LEFT JOIN contents_urls ON ((contents_urls.content_id = contents.id))) ` + 13 `LEFT JOIN urls ON ((urls.id = contents_urls.url_id))) ` + 14 `LEFT JOIN contents_tags ON ((contents_tags.content_id = contents.id))) ` + 15 `LEFT JOIN tags ON ((tags.id = contents_tags.tag_id))) ` + 16 `WHERE modified < ? ` + 17 `AND tags.name in (? ` + tagsSql + 18 `AND urls.url like ? ` + 19 `GROUP BY contents.id ` + 20 `Limit ? ` 21 22 urlSql := fmt.Sprintf("%%%s%%", url) 23 24 // syntax error: unexpected urlSql, expecting ) 25 q, err := db.Query(sqlstr, *modifiedBefore, tags..., urlSql, n) 26 27 if err != nil { 28 return nil, err 29 } 30 defer q.Close() 31 32 // load results 33 var res []*ContentsWithAll 34 for q.Next() { 35 cwa := ContentsWithAll{} 36 37 // scan 38 err = q.Scan(/*省略*/) 39 if err != nil { 40 return nil, err 41 } 42 43 res = append(res, &cwa) 44 } 45 46 return res, nil 47} 48
先ず IN演算子
の構文を含める場合sqlstrの?の数が可変長になります。
実際 stackoverflowの情報をヒントにsqlstrの?
の数をtagsのtag数に応じて増減させています。
その場合のdb.Queryのパラメータの渡し方を教えて下さい。
現状 *modifiedBefore, tags..., urlSql, n
という渡し方ではsyntaxerrorとなってしまいます。
どう渡せばいいんでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。