Gorm查询数据同时使用where和raw报错:如何解决where和raw方法一起使用导致的SQL语法错误?

混合 where 和 raw 会导致错误。

直接以Raw格式编写完整的SQL。

或者输入其中的字符串。

不要混淆他们。

示例:2 02 3 年 5 月,北京,tagIDs=[1 ,2 ,3 ]。

db.Where("idIN?", tagIDs).Where("status=?", "active").Find(&results).
或 db.Raw("从 your_table 中选择 idIN? AND St​​atus=?", tagIDs, "active").Scan(&results).
子查询使用db.SubQuery()。

不要混淆他们。

SQL INSERT语句报错:语法错误"near ')values(' "如何解决?

哎呀,我很熟悉这个 SQL 错误。
去年,我就因为这个,在一个项目上卡了很长一段时间。
我遇到了你说的“near ')'values('”错误,是这样的:
---
场景:2 02 2 年,北京有一个后端电商系统项目。

具体情况:一个朋友写了一条INSERT语句,想要插入用户信息,代码看起来没问题,但是运行的时候报了这个错误,看到这个的时候,哦,列名后面多了一个逗号,e.g. this是:
sql 插入用户(姓名、年龄、电子邮件) VALUES('Alice','2 5 ','alice@example.com');
您会看到,电子邮件地址后面的逗号是多余的。
这个东西在开发环境中不好找,一创建就炸了。
后来我改了,去掉了逗号:
sql 插入用户(姓名、年龄、电子邮件) VALUES('Alice','2 5 ','alice@example.com');
它马上就起作用了。

---
我也遇到了你所说的原因:
1 列名与VALUES的数量不对应:例如,有三个列名:name、age、email,但VALUES中只指定了两个值。
我看到一个实习生这样做。
写完之后他就疑惑了,问为什么报错。
我直接说,看看你是不是漏填了这个值。
稍后添加第三个值即可。
背景:2 02 1 年,上海,新员工编写的代码。
他写道: sql 插入用户(姓名、年龄) VALUES('鲍勃','3 0'); 当我看到这个时,电子邮件地址没有列出,所以我直接更改了它。

2 括号使用不正确。
有时人们会使用方括号 [],尤其是在使用 SQL Server 时。
我之前用过MySQL。
当我看到有人使用{}括号时,我立即感到困惑,并询问如何做。
后来我发现格式不对。
背景:2 02 0年,深圳,调动的同事。
他写道: sql 插入产品[id,名称] 值{1 ,'图书'}; 我看到这个就直接说括号用错了,换括号吧。

3 保留字不会被转义:例如,如果列名是 order 并且结果是直接 INSERTINTO order VALUES(...),MySQL会爆炸。
我曾经看到一个老人写了一堆SQL,结果报错。
最后他发现自己并没有留意逃跑的事。
背景:2 01 9 年,杭州,老员工写的剧本。
他写道: sql INSERT INTO order(select, table) VALUES(1 ,2 ); 当我查看它时,我发现反引号已被添加,一切都很好。

---
我也经常使用的解决方案:

参数化查询:我已经使用这个东西 1 0 年了。
这可以防止注入并且不会引起语法问题。
去年的项目中,我把所有的INSERT都替换成了参数化,再也没有出现过类似的错误。
背景:2 02 2 年,北京,新项目。
我正在编写Java代码: 爪哇 String sql = "INSERT INTO users(姓名,年龄) VALUES(?,?)"; ReadedStatement stmt = Connection.prepareStatement(sql); stmt.setString(1 , "查理"); stmt.setInt(2 , 2 8 ); stmt.executeUpdate(); 这样就不会有这些语法问题了。


简化调试。
如果您正在编写复杂的 INSERT 命令,并且不知道出现问题时如何修复它,请先简化它。
例如,如果有三个名称:姓名、年龄和电子邮件,您可以先尝试一个: sql 插入用户(名称) 值('戴夫'); 好的,我们再添加一个: sql 插入用户(姓名、年龄) 值('戴夫',3 0); 这样,一步步来,就能快速发现问题所在。

---
总结一下:
这些SQL错误其实都是小问题,但是很烦人。
主要是要小心,尤其是写完SQL之后,如果再看一下或者用工具运行一下,可以省去很多问题。
就像那个多余的逗号一样,原本可以在几秒钟内发现的东西最终却被卡住了很长时间。

您提到的分析和解决方案是非常正确的。
我不会详细介绍。
他们都很普通。
如果您有更具体的场景,例如特定数据库的问题,我会告诉您更多信息。