我想在我的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