Go 中使用 SET 变量进行 MySQL 查询
背景:
用户正在尝试使用 Go 执行复杂的 MySQL 查询,其中涉及在运行查询之前设置用户变量。该查询从控制台成功执行,但在通过 Go 运行时失败并出现语法错误。用户质疑在 Go 的 Query() 方法中使用 SET 变量的可能性。
解决方案:
通过进行以下修改解决了用户的问题:
DSN 配置:
数据库和表转换:
代码:
通过这些修改,用户提供的代码应该可以工作正如预期的那样:
<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中文网其他相关文章!