当前位置: 首页 > 面试题库 >

Golang MySQL使用IN运算符查询未定义数量的args

齐思淼
2023-03-14
问题内容

我正在尝试通过IN运算符使用MySQL查询,并在Golang项目中使用未定义数量的参数。

我正在使用该软件包,github.com/go-sql- driver/mysql并尝试在此Stackoverflow答案上构建我的解决方案:如何使用Golang在SQL中执行IN查找?

我读过一些类似的文章,为我提供了一些建议,但是我被困在查询的执行部分,因为它不允许直接使用slice作为参数。

//converting my form args []string into []int
var args []int
for _, v := range r.Form["type"] {
    t, _ := strconv.Atoi(v)
    args = append(args, t)
}

sql := "SELECT id, name FROM resources WHERE id IN (SELECT resource_id FROM resources_types WHERE type_id IN (?" + strings.Repeat(",?", len(args)-1) + "))"
fmt.Println("Query : ", sql)
stmt, _ := db.Prepare(sql)
rows, err := stmt.Query(args)
defer stmt.Close()

Golang在执行时向我返回错误:

查询:SELECT ID,名称从资源WHERE ID IN(SELECT resource_id从资源类型WHERE type_id IN(?,?))“
sql:语句需要2个输入;得到1个”

当我尝试

rows, err := stmt.Query(args[0], args[1])

但是由于我需要数量不确定的参数,所以这不是解决方案。至少有可能使其与MySQL一起使用吗?


问题答案:

Stmt.Query() 具有可变参数:

func (s *Stmt) Query(args ...interface{}) (*Rows, error)

这意味着您可以使用省略号...将切片值作为可变参数的值传递,但是该切片必须为类型[]interface{},例如:

var args []interface{}
for _, v := range r.Form["type"] {
    t, _ := strconv.Atoi(v)
    args = append(args, t)
}

// ...

rows, err := stmt.Query(args...)

或者,您可以预先构建SQL查询并执行而不传递查询参数。



 类似资料:
  • 问题内容: 我正在寻找一种使用数组中的“ IN”子句查询postgres jsonb字段的方法。 假设我有一张桌子 我需要选择test_content数组中的label可能为或的行。 我试过了 但是当我想用包含扩展查询时,或者变得复杂… 我需要的是 jsonb运算符可以吗? 问题答案: 简短答案 您可以在横向联接中使用该函数,并在子句中的复杂表达式中使用其结果: 不同 当在单个行中的多个数组元素中

  • 问题内容: 我只是试图制作一个简单的类,让我弄清楚文件的长度: 我遇到了一个问题 我得到错误: 未为参数类型定义运算符!= int,null 有什么想法为什么会阻止这种情况吗? 问题答案: Java中的原始类型不能为。如果要检查0,请执行。

  • 问题是我得到错误(过滤器表达式只能包含非主键属性:主键属性:名称)。租户是我的主分区键,名称是我的主排序键。 我需要在dynamo db中编写与此等效的内容:从项目中选择*,其中tenant='testProject',name in('John','Dave')。

  • 我有一张名为产品的桌子。它的架构是 CustomerNumber(字符串类型的哈希键) ProductID(字符串类型的范围键) > DynamodbQueryExpression将只对索引/hashkey进行查询,而不是对hashkey列表进行查询,如上例所示。 此外,DynamoDBQueryExpression不支持OR运算符。 另外,BatchLoad只使用主键(在我的例子中是custom

  • 问题内容: JavaScript中的另一种常见情况是为变量提供预设值(如果未定义),例如: 快捷方式表示法是双竖线字符: 由于某种原因,我无法为我工作。是否真的有可能检查是否定义了v,如果x = 10则不定义? 谢谢。 问题答案: 该Opera文章对正在发生的事情给出了不好的描述。 确实会得到if is 的值。如果具有 任何 “假”值也将是正确的。 __ JavaScript中的“ falsey”

  • 问题内容: …按预期工作,但是如果我需要像这样检查多个字符串怎么办: …似乎不起作用。 问题答案: