我正在try 清理Go调用MySQL查询的方式,方法是在运行查询之前设置一些变量,并在单个值周围使用大量的Case语句.我试图运行的查询在控制台上运行得很好,但在运行GO时,由于语法问题,我在SELECT上失败了.这样的事情有可能发生吗?

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
}

现在,如果我拿出设置的棋子,用?替换所有的@个变量,然后多次传递srt个变量,如下所示.但我真的不希望有这样的查询呼叫:

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

报告的错误没有多大帮助:

Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT\n    *\nFROM\n    inventory\nWHERE\n    user_id = @user_id\nORDER BY\n ' at line 3

谢谢你的帮助.

推荐答案

对于那些感兴趣的人,我已经用一些更新解决了我的问题.

  1. 当连接?...&multiStatements=true&interpolateParams=true时,DSN上有设置

  2. 添加了上面的内容之后,我开始收到一个关于排序规则的新错误(Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='.我判断了数据库和表,并将其转换为utf8mb4_general_ci,一切正常.

感谢那些提供解决方案的人,但这是我们最终 Select 的路由.

Mysql相关问答推荐

MySQL有没有办法直接从CSV文件中读取而不是导入它?

MySQL逻辑全部

如何将左联接的小计/总计行中的所有列作废

提高bash脚本从大型gml文件读取数据的效率

为什么用PyMySQL构建的json返回结果会出现重复?

我在连接到 mysql 的 node js 中收到错误消息发送到客户端后无法设置标头

是否可以使用以EXPLAIN EXTENDED ...开头的 SQL 语句修改数据?

MySQL:根据条件查找某些用户的行位置

0000-00-00 00:00:00 表中的日期设置为 NOT NULL

MySQL:从 n 个关系表中 Select 所有具有 MAX() 值的行

查询以从约会表中获取可用空档

在 SQL 中将列添加为 End_date,间隔为 +100 天

在 postgresql 中实现 UML 类:创建类型与创建表

基于 2 列的重复行的 SQL 查询

我在查询中没有得到正确的结果

为什么数据库行元组中的整数具有L后缀?

MySQL使用phpmyadmin重新排列列的顺序

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合

将行插入 MySQL 数据库的最有效方法

如何在 MYSQL 中使用 SQL 在两个日期时间值之间减go 并以分钟或秒为单位检索结果?