首页 >后端开发 >Golang >如何使用 SET 变量解决 Go for MySQL 查询中的语法错误?

如何使用 SET 变量解决 Go for MySQL 查询中的语法错误?

Susan Sarandon
Susan Sarandon原创
2024-10-24 04:33:30852浏览

How to Resolve Syntax Errors in Go for MySQL Queries Using SET Variables?

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

在 Go 中,可以在运行 MySQL 查询之前使用 SET 语句。但是,必须满足某些语法要求。本文探讨了尝试执行此类查询时遇到的问题并提供了解决方案。

原始代码片段涉及定义一个根据用户 ID 和排序参数选择记录的函数。它在执行查询之前使用 SET 语句为变量赋值。然而,这种方法在通过 Go 运行时会导致语法错误。

该错误可归因于查询的构造方式。具体来说,SET 语句需要封装在括号中,并放置在 SELECT 语句之前。此外,MySQL DSN 应包含设置“multiStatements=true”和“interpolateParams=true”。

以下更新的代码片段解决了该问题:

<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 ?,?;
    `

    dsn := d.dsn + "?multiStatements=true&interpolateParams=true"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        return nil, err
    }
    defer db.Close()

    rows, err := db.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>

通过包含 SET 语句在括号中并在 DSN 中启用多语句和参数插值,查询在 Go 中成功执行,没有任何语法错误。此外,将数据库和表转换为 utf8mb4_general_ci 排序规则可以解决与字符集兼容性相关的任何潜在问题。

以上是如何使用 SET 变量解决 Go for MySQL 查询中的语法错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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