go mysql 条件查询_Go-MySQL-Driver:具有可变查询参数的预备语句

我想在我的Go服务器上使用带有MySQL的预处理语句,但是我不确定如何使它与未知数量的参数一起使用.一个端点允许用户发送ID数组,Go将从数据库中选择与给定ID匹配的对象.这个数组可以包含1到20个id的任意值,那么我将如何构造一个准备好的语句来处理呢?我看过的所有示例都要求您确切地知道查询参数的数量.

我能想到的唯一(非常不可能)的选择是准备20个不同的SELECT语句,并使用与用户提交的ID数量匹配的那个语句-但这似乎是很糟糕的事情.我什至会看到准备好的语句在性能上的好处吗?

我很困在这里,所以任何帮助将不胜感激!

解决方法:

我知道,没有RDBMS能够绑定未知数量的参数.永远不可能将未知数量的参数占位符与数组匹配.这意味着没有明智的方法将数组绑定到查询,例如:

SELECT xxx FROM xxx WHERE xxx in (?,...,?)

这不是客户端驱动程序的限制,数据库服务器根本不支持.

有多种解决方法.

您可以使用20?创建查询,绑定具有的值,并通过NULL值完成绑定.由于涉及NULL值的比较操作的特殊语义,因此它可以正常工作.类似“ field =?”的条件当参数绑定到NULL值时,即使某些行匹配,其结果始终为false.假设您的数组中有5个值,则数据库服务器将必须处理5个提供的值以及15个NULL值.通常只要忽略NULL值就足够聪明了

另一种解决方案是准备所有查询(每个查询具有不同数量的参数).仅在最大参数数量受到限制的情况下才有意义.它在准备好的语句确实很重要的数据库(例如Oracle)上很好地工作.

就MySQL而言,使用预处理语句的收益非常有限.请记住,准备好的语句仅在每个会话中维护,不会在会话之间共享.如果您有很多会话,它们会占用内存.另一方面,使用MySQL解析语句不会涉及太多开销(与某些其他数据库系统相反).通常,生成大量准备好的语句来覆盖单个查询是不值得的.

请注意,某些MySQL驱动程序提供了一个预准备语句接口,而它们内部没有使用MySQL协议的预准备语句功能(再次,因为通常这样做是不值得的).

还有其他一些解决方案(例如依赖临时表),但是只有在参数数量很大的情况下,它们才有意义.

标签:go,rest,http,mysql

来源: https://codeday.me/bug/20191120/2043510.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值