【问题标题】:How do I do IN queries in Go?如何在 Go 中进行 IN 查询?
【发布时间】:2013-05-13 17:12:58
【问题描述】:

我想在 Go 中使用“database/sql”包运行这样的查询:

SELECT id, name FROM users WHERE id IN (1,2,3,4);

如何在查询命令中使用变量替换?例如,我想这样做(这当然行不通):

db.Query("SELECT id, name FROM users WHERE id IN (?)", []int{1,2,3,4})

【问题讨论】:

  • db.Query("... IN (?, ?, ?)", []int{1, 2 ,3}) 有效吗?有机会使用 ORM 吗?
  • 这取决于您的数据库驱动程序。查阅其文档。以规定的形式可能是不可能的。

标签: mysql go


【解决方案1】:

@Volker 在 cmets 中建议某些数据库驱动程序可能能够为您扩展切片。但是,任何驱动程序都可以单独处理切片元素:

db.Query("SELECT id, name FROM users WHERE id IN (?, ?, ?, ?)", 1, 2, 3, 4)

当然,当您编写该代码时,您需要确切地知道切片中有多少元素,但实际情况可能并非如此。生成正确数量的问号非常简单,并为您提供了一个通用解决方案:

ints := []interface{}{1,2,3,4}
marks := strings.Repeat("?,", len(ints) - 1) + "?"
db.Query("SELECT id, name FROM users WHERE id IN (" + marks + ")", ints...)

如果你的切片可能是空的,你必须以某种方式处理它。

【讨论】:

  • db.Query 采用 ...interface{} 而不是 ...int。这意味着您不能以当前形式传递ints...。如果您将ints := []int{1,2,3,4} 更改为ints := []interface{}{1,2,3,4},它应该可以正常工作。
猜你喜欢
  • 2011-08-23
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 2014-11-19
  • 2013-01-06
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多