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

Golang中跨数据库的准备好的语句绑定(如和在何处)

窦哲彦
2023-03-14
问题内容

阅读了许多教程之后,我发现有很多方法可以在Go中的预准备语句上绑定参数,其中一些方法

SELECT * FROM bla WHERE x = ?col1 AND y = ?col2
SELECT * FROM bla WHERE x = ? AND y = ?
SELECT * FROM bla WHERE x = :col1 AND y = :col2
SELECT * FROM bla WHERE x = $1 AND y = $2

第一个问题 ,跨数据库绑定参数的方法是什么?(适用于任何数据库)

第二个问题 ,我没有阅读过有关LIKE语句的教程,如何LIKE正确绑定-statement的参数?

SELECT * FROM bla WHERE x LIKE /*WHAT?*/

第三个问题 ,也没有一个给出IN声明的例子,如何IN正确绑定声明的参数?

`SELECT * FROM bla WHERE x IN ( /*WHAT?*/ )

问题答案:

跨数据库绑定参数的方式是什么?

对于数据库/ sql,没有任何内容。每个数据库都有其表示参数占位符的方式。Go数据库/
sql程序包不为准备好的语句提供任何规范化工具。准备好的语句文本只是传递给基础驱动程序,而驱动程序通常只是将它们未经修改地发送到数据库服务器(或html" target="_blank">嵌入式数据库的库)。

如何正确绑定LIKE语句的参数?

您可以在like语句之后使用参数占位符,并将其绑定为字符串。例如,您可以将准备好的语句编写为:

SELECT a from bla WHERE b LIKE ?

这是一个示例(省略了错误管理处理)。

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

// > select * from bla ;
// +------+------+
// | a    | b    |
// +------+------+
// | toto | titi |
// | bobo | bibi |
// +------+------+

func main() {

    // Open connection
    db, err := sql.Open("mysql", "root:XXXXXXX@/test")
    if err != nil {
         panic(err.Error())  // proper error handling instead of panic in your app
    }
    defer db.Close()

    // Prepare statement for reading data
    stmtOut, err := db.Prepare("SELECT a FROM bla WHERE b LIKE ?")
    if err != nil {
        panic(err.Error()) // proper error handling instead of panic in your app
    }
    defer stmtOut.Close()

    var a string
    b := "bi%"    // LIKE 'bi%'
    err = stmtOut.QueryRow(b).Scan(&a)
    if err != nil {
        panic(err.Error()) // proper error handling instead of panic in your app
    }
    fmt.Printf("a = %s\n", a)
}

请注意,%字符是绑定字符串的一部分,而不是查询文本的一部分。

如何正确绑定IN语句的参数?

我知道没有一个数据库允许直接使用IN子句绑定参数列表。这不是数据库/ sql或驱动程序的限制,但是大多数数据库服务器都不支持。

您可以通过多种方法来解决此问题:

  • 您可以在IN子句中使用固定数量的占位符构建查询。仅绑定提供的参数,并使用NULL值完成其他占位符。如果您的值多于所选的固定数,则只需多次执行查询。这不是非常优雅,但是可以有效。

  • 您可以使用不同数量的占位符构建多个查询。一个查询IN(?),第二个查询IN(?,?),第三个查询IN(?,?,?),等等……将准备好的查询保留在语句高速缓存中,然后在以下位置选择正确的查询:运行时间取决于输入参数的数量。请注意,它占用内存,并且通常最大的预备语句数量是有限的,因此当参数数量很大时就不能使用它。

  • 如果输入参数的数量很大,则将它们插入临时表中,然后用与临时表的联接将查询替换为IN子句。如果您在一次往返中设法在临时表中执行插入,则非常有效。使用Go和数据库/ sql,这很不方便,因为无法批量查询。

这些解决方案中的每一个都有缺点。他们都不是完美的。



 类似资料:
  • 问题内容: 我真的希望有人花一点时间查看我的代码。我正在解析一些新闻内容,并且可以将初始解析插入到包含新闻URL和标题的数据库中。我想进一步扩展它,传递每个文章链接并分析文章的内容,并将其包含在我的数据库中。初始解析完全像这样工作: 如您所见,我正在使用PHP Simple HTML DOM Parser。 为了扩展,我尝试使用mysqli语句来绑定参数,以便将所有html标记插入数据库。我之前使

  • 我想知道使用比有什么好处? 最简单的方法是: 如您所见,我可以将数据绑定到< code>preparedStatement而无需< code>boundStatements。< code>boundStatement在哪里有用?

  • 我可能有一个简单的编码问题,但我无法解决。我在MySQL数据库中有英文或中文的地址,所以我使用了utf8_unicode_ci。我从数据库中检索我的汉字没有问题,但我不能在准备好的请求中使用汉字。 我解释说:如果我打 我会得到一个结果,因为其中一个地址包含“”但如果我尝试使用一个准备好的请求: 如果$_post[“address”]在英文中有效,在中文中就不行了:p 编辑: 当请求show变量时,

  • 首先,我知道这是一个重复的问题,我问的是同样的问题。但是我已经阅读了所有与相同问题相关联的解决方案,但是当我遵循建议的解决方案时,它将触发更多的警告出现。这就是我的代码 获取 只为得到这些警告; 警告:mysqli_stmt::bind_param():第119行C:\xampp\htdocs\gsd\emergency\records.php中的变量数与准备好的语句中的参数数不匹配 警告:mys

  • 我一直在阅读有关SQL注入的文章,并决定修改我的代码以防止SQL注入。 例如,我有一个输入,我将值插入到我的数据库中。最初,我对注射的警惕是这样的: 在我读过的文章中,有人建议应该使用预准备语句。我更改了我的代码并使用了它: 虽然这可以防止SQL注入,但它不会对XSS做任何事情。所以我决定修改(并使用它来防止脚本注入。 现在,我的问题是如何使用预先准备好的语句。我将插入三个项目;艺术家、专辑和歌曲