gpt4 book ai didi

mysql - 使用 SET 变量进行 MySQL 查询

转载 作者:行者123 更新时间:2023-12-05 02:26:53 24 4
gpt4 key购买 nike

我试图通过设置一些变量来清理 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
}

现在,如果我取出 SET 片段并将所有 @ 变量替换为 ?,然后将 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. 连接时DSN上有设置?...&multiStatements=true&interpolateParams=true

  2. 添加上述内容后,我开始收到有关排序规则的新错误(Illegal mix of collat​​ions (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '='。我去了通过并将数据库和表转换为 utf8mb4_general_ci,一切都按预期工作。

感谢那些提供解决方案的人,但这是我们最终选择的路线。

关于mysql - 使用 SET 变量进行 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73584426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com