mysql - 如何将 `where in` 与整数片段一起使用

标签 mysql go slice go-gorm

来自 http://jinzhu.me/gorm/advanced.html#sql-builder ,我应该能够使用 WHERE IN 和单个 (?) 更新多行并将 slice 传递给单个 ? 而不是 WHERE IN (? ,?,?,?)

来自jinzhu.me的示例如下:db.Exec("UPDATE orders SET shipped_at=? WHERE id IN (?)", time.Now, []int64{11,22,33})。这是 gorm 的测试示例,显示它可以正常工作。 https://github.com/jinzhu/gorm/blob/021d7b33143de37b743d1cf660974e9c8d3f80ea/main_test.go#L449

但这对我不起作用:

var availableIds []int
for _, p := range v.Products {
    availableIds = append(availableIds, p.Id)
}

log.Println(availableIds)

db.Exec("UPDATE product_supplier SET deleted_at=? WHERE supplier_id = ? AND sku NOT IN (?)", time.Now(), 3, availableIds)

输出:

2016/04/19 07:48:44 [336 338 337 306 329 94 79 43 57 313 108 122 126 127 124 125 123 221 93 330 335 333 312]

(sql: expected 2 arguments, got 25)

当我尝试硬编码时,我遇到了同样的问题:

db.Exec("UPDATE product_supplier SET deleted_at=? WHERE supplier_id = ? AND sku NOT IN (?)", time.Now(), 3, []int{313, 108})

输出:

(sql: expected 2 arguments, got 4)

解决方案:

代码实际上根本没有窃听。我是不是很傻——我的实际代码中有一个额外的参数,而不是我应该有的。我只是没有正确翻译堆栈溢出。我的错。

最佳答案

prepare 功能的本能会阻止您将 slice 作为参数传递。

db.Exec在Go中的实现是先准备查询(包括变量占位符),然后发送参数。

如果您想知道为什么 prepare 会阻止您传递 slice ,请阅读 this answer .

作为解决方法,需要在程序中连接与 slice 大小相同数量的占位符,这应该生成如下查询:

... WHERE supplier_id = ? AND sku NOT IN (?, ?, ?, ?)

示例代码:

Ids := []int{1, 2, 3}
query := "... WHERE supplier_id = ? AND sku NOT IN (" + genVar(len(Ids)) + ")"
db.Exec(query, 3, Ids)

更新:

原来 Gormdb.Exec 方法的实现不是使用 DBMS 的准备功能,而是连接驱动程序中的字符串。

我现在的诊断是依赖项中可能有问题。

您是否像 http://jinzhu.me/gorm/ 中显示的那样导入 Gorm

关于mysql - 如何将 `where in` 与整数片段一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36711086/

相关文章:

php - 从 csv 中删除完整的列和数据

go - 我无法将数据分配给 []map[string]interface{}

mysql - 从其他容器访问 mysql 容器

php - Mysql Current Timestamp 和 time() 显示不同的值

go - 为什么 Golang http 参数 (URL.Query()) 是列表的映射?

go - 使用正在运行的 shell 修改 golang Docker 容器

arrays - R数组操作

sorting - 根据值的出现次数对 slice 进行排序

java - 从数据库读取时为 "Operation not allowed after ResultSet closed"

templates - 如何从已解析的模板中获取模板 'actions' 的 map 或列表?