首页 >后端开发 >Golang >使用 Go 的 Query() 方法时可以使用 SET 变量执行 MySQL 查询吗?

使用 Go 的 Query() 方法时可以使用 SET 变量执行 MySQL 查询吗?

Susan Sarandon
Susan Sarandon原创
2024-10-24 02:37:02428浏览

Can You Execute MySQL Queries with SET Variables when Using Go's Query() Method?

Go 中使用 SET 变量进行 MySQL 查询

背景:

用户正在尝试使用 Go 执行复杂的 MySQL 查询,其中涉及在运行查询之前设置用户变量。该查询从控制台成功执行,但在通过 Go 运行时失败并出现语法错误。用户质疑在 Go 的 Query() 方法中使用 SET 变量的可能性。

解决方案:

通过进行以下修改解决了用户的问题:

  1. DSN 配置:

    • 将 ?multiStatements=true&interpolateParams=true 添加到连接数据库时使用的 DSN。这允许在一次调用中执行多个语句并启用参数插值。
  2. 数据库和表转换:

    • 将数据库和相关表转换为utf8mb4_general_ci排序规则。这解决了与排序规则不匹配相关的错误。

代码:

通过这些修改,用户提供的代码应该可以工作正如预期的那样:

<code class="go">func (d *DB) SelectByUserId(uid string, srt string, pg, lim int) ([]Inventory, error) {
    query := `
    SET @user_id := ?,
        @orderBy := ?;
    SELECT
        *
    FROM
        inventory
    WHERE
        user_id = @user_id
    ORDER BY
        (CASE WHEN @orderBy = 'type,asc' THEN type END),
        (CASE WHEN @orderBy = 'type,desc' THEN type END) DESC,
        (CASE WHEN @orderBy = 'visible,asc' THEN visible END),
        (CASE WHEN @orderBy = 'visible,desc' THEN visible END) DESC,
        (CASE WHEN @orderBy = 'create_date,asc' THEN create_date END),
        (CASE WHEN @orderBy = 'create_date,desc' THEN create_date END) DESC,
        (CASE WHEN @orderBy = 'update_date,asc' THEN update_date END),
        (CASE WHEN @orderBy = 'update_date,desc' THEN update_date END) DESC
    LIMIT ?,?;
    `

    rows, err := d.Query(
        query,
        uid,
        srt,
        pg*lim,
        lim,
    )

    if err != nil {
        return nil, err
    }
    defer rows.Close()

    result := make([]Inventory, 0)
    for rows.Next() {
        var inv Inventory
        if err := rows.Scan(
            &inv.Id,
            &inv.UserId,
            &inv.Type,
            &inv.Name,
            &inv.Description,
            &inv.Visible,
            &inv.CreateDate,
            &inv.UpdateDate); err != nil {
            return result, err
        }
        result = append(result, inv)
    }
    if err = rows.Err(); err != nil {
        return result, err
    }

    return result, nil
}</code>

通过修改 DSN 配置并将数据库和表转换为适当的排序规则,用户可以成功执行相关查询,同时避免语法错误。

以上是使用 Go 的 Query() 方法时可以使用 SET 变量执行 MySQL 查询吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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