首页  >  文章  >  后端开发  >  如何在 IN 子句中使用切片执行 Go 数据库查询?

如何在 IN 子句中使用切片执行 Go 数据库查询?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-25 21:11:28393浏览

How to Execute a Go Database Query with a Slice in the IN Clause?

使用 Slice IN 子句的 Golang 数据库查询:全面理解

问题:

为什么下面的 Golang 数据库查询在 IN 子句中使用整数切片失败:

<code class="go">inq := "6,7" //strings.Join(artIds, ",")
rows, err = db.Query("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (?)", inq)</code>

答案:

出现此问题的原因是用于查询的数据库/sql 包未检查查询并将参数直接传递给数据库驱动程序。这使得处理包含可变数量参数的 IN 子句的查询具有挑战性。

在提供的查询中,?绑定变量对应于单个参数,而预期用途是根据切片 artIds 的长度绑定多个参数。但是,驱动程序无法正确处理此问题。

要解决此问题,建议使用 sqlx 包,它可以更好地控制数据库查询。

解决方案使用sqlx 包:

<code class="go">var artIds = []int{6, 7}
query, args, err := sqlx.In("SELECT DISTINCT title FROM tags_for_articles LEFT JOIN tags ON tags.id = tags_for_articles.tag_id WHERE article_id IN (?);", artIds)</code>

sqlx.In 函数处理查询并为整数切片生成适当的绑定变量,使查询能够成功执行。

有关此主题的更多信息,请参阅 InQueries 的 Godoc 文档。

以上是如何在 IN 子句中使用切片执行 Go 数据库查询?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn