如何解决golang sql驱动程序的prepare语句?

差异可能是细微的,有时是重要的,有时实际上是不存在的。

通常,一条准备好的语句1.准备服务器(解析sql,生成执行计划等),2.使用其他参数执行,然后3.关闭。它使您可以重复使用相同的sql,并且每次都传递不同的参数,它可以帮助防止sql注入,可以提供一些性能增强(特定于驱动程序/协议,YMMV)并防止重复步骤,例如在执行计划生成和sql解析中上面的准备 步骤。

对于编写源代码的人而言,准备好的语句可能比连接字符串并将其发送到DB服务器更为方便。

DB.Query()Exec()QueryRow()
DB.Prepare()stmt.Exec(...args)

就两者之间的差异以及为什么使用一种或另一种而言,有几件事值得考虑。

DB.Query()

您还可以将其与其他参数一起使用,并在查询字符串中使用占位符,并且它将在我前面提到的情况下在其后执行准备好的语句。这里的潜在问题是,当您进行多个查询时,每个查询都会导致内部准备好的语句。由于涉及到额外的步骤,因此在每次执行该查询时,它都会重新准备,执行和关闭,因此效率很低。

使用显式的准备好的语句,当您尝试使用可能具有不同参数的重用先前准备的sql时,可以避免这种效率低下的情况。

DB.Prepare()

因此,很明显,您在哪种情况下使用哪种取决于您的特定用例,但是我希望上面的详细信息对您有所帮助,以便您可以在每种情况下做出最佳决策。

更新资料

给定OP中的更新,当查询只需要执行一次时,基本上没有什么区别,因为带有参数的查询是作为幕后的准备好的语句完成的。

DB.Query()

由于在这种情况下,出于安全原因而使用了准备好的语句,因此值得通过其他方式来处理安全问题并改为使用纯文本查询,因为这将提高性能。但是,除非有足够的流量(或预计将来流量会大大增加)以减轻服务器上的负载,否则任何收益都是无关紧要的。再次归结为现实用例。

对于有兴趣在某些指标上准备的语句和直接明文查询之间的差别的人,有一个很好的文章在这里(这也很好地解释很多上述的一个出色的工作)。

解决方法