我正在尝试运行如下所示的查询,但只返回第一个id值: -
select * from `table` where table`.`id` in ('1', '2', '3', '4', '5', '6', '7', '9', '11', '13', '14', '15', '17') and `table`.`deleted_at` is null
我做了以下事情: -
var aID = make([]string, 0)
var in india // india is struct
for rows.Next() {
cook := rows.Scan(&in.ID)
aID = append(aID, strconv.Itoa(in.ID))
}
asID = strings.Join(aID, ",")
anotherRow,err := db.Query("SELECT * from table2 where id in (?)", asID)
if err != nil { fmt.Printf("Error: ", err) }
// ... Other line follows up with "for anotherRow.Next() and fetching"
在获取数据时,它只返回" 1"的值。并忽略与他一起传递的所有其他ID,'2', '3', '4', '5', '6', '7', '9', '11', '13', '14', '15', '17'
。
我怎样才能正确传递?
我正在使用go-sql-driver/mysql
。
常见问题:
aID
确实包含所有这些数字为字符串和
表格包含id
上面提供的所有可用行。
table
来自获取id
并附加到aID
的位置,id
中存储aID
的其他记录将以{in
获取1}}来自table2
的陈述。
由于
答案 0 :(得分:5)
您可以这样做:
args := make([]interface{}, len(asID))
for i, id := range asID {
args[i] = id
}
stmt := `SELECT * from table2 where id in (?` + strings.Repeat(",?", len(args)-1) + `)`
anotherRow, err := db.Query(stmt, args...)
请注意,如果asID
可以使len == 0,你会想要一个警卫。
如果您要传递任何其他参数,则必须将它们添加到args
切片。
另外需要注意的是,您应该明确命名所需的列,这样可以保证您在正确的列中扫描到正确的字段。
答案 1 :(得分:2)
尝试
q,args,err := sqlx.In("SELECT * FROM table2 WHERE id IN(?);", asID) //creates the query string and arguments
rows, err := db.Query(q,args...)
答案 2 :(得分:0)
由于您正在处理来自您自己的数据库的ID,并且如果您确定某人无法将恶意“ID”注入该代码,请不要使用占位符?
并仅使用{ {1}}包。
fmt
这将导致fmt.Sprintf("SELECT * from table2 where id in (%s)", asID)
而不是SELECT * from table2 where id in (1,2,3,4...)
答案 3 :(得分:0)
示例:
class FeedbacksView(private val feedbackService: FeedbackService) : HorizontalLayout() {
private val grid;
private val sidebar;
init {
width = "100%"; height = "100%"
grid = grid<FeedbackListModel> {
flexGrow = 3.0
setItems(feedbackService.fetchFeedbacks())
// add columns ...
}
sidebar = verticalLayout {
flexGrow = 1.0
text("foo")
}
}
}
效果很好
答案 4 :(得分:0)
最巧妙的查询解决方案,使数组/切片直接与sql查询一起使用。这也是sql注入证明,因为您没有使用字符串连接,而是使用sql prepare语句
update
答案 5 :(得分:0)
也许是这样的。
func GetPlaceholders(values ...string) (placeholders string, parameters []interface{}) {
n := len(values)
p := make([]string, n)
parameters = make([]interface{}, n)
for i := 0; i < n; i++ {
p[i] = "?"
parameters[i] = values[i]
}
placeholders = strings.Join(p, ",")
return placeholders, parameters
}
并像这样调用函数
placeholders, params := GetPlaceholders("1", "2", "3")
rows, err := db.Query(`select language, textkey, text
from language where textkey in (`+placeholders+`)
order by language, textkey`, params...)