[gogf/gf]给gdb生成的sql语句中的表名加上引号,对Where()中独立出现的单词视为字段名加上引号

2024-06-25 502 views
9
244

目前gdb生成的sql语句中的表名都没有加引号,无法处理与sql关键字同名的表名,修改为统一给表名加上引号。 对于Where()中的字符串,或Map/Struct的键名/字段名,如果是单个单词(由字母、数字、下划线组成),就视为字段名,统一加上引号。

相应的,增加了测试文件 gdb_unit_keyword_test.go,测试用表名字为 values,其中带有名字为 key 的字段。

gdb_unit_z_transaction_test.go 中的 Test_TX_Update() 中有一个bug: if result, err := db.Update(table, "create_time='2019-10-24 10:00:00'", "id=3"); 应是: if result, err := tx.Update(table, "create_time='2019-10-24 10:00:00'", "id=3");

回答

2

@alai04 你好,感谢提供PR。你提交的代码我review了并提供了一些改进建议。此外还有几点需要说明的:

  1. 你提的tx变量的问题我已修复,你拉取最新主库代码合并到本地对比,你的提交漏改了一个地方;
  2. 不要新建表来做测试,可以在原有的单元测试user自动表中新建一个字关键字段,也不会影响原有的单元测试;
  3. 你不用新建单元测试文件,你需要在method, model, transaction单元测试中都新增一个测试用例即可,该测试用例可能包含多个gtest.Case
3

感谢回复,我会根据你的建议再尝试一下。

  1. gdb_unit_z_transaction_test.go 的 Test_TX_Update() 中只需要把第一个 db 改成 tx,第二个db是正确的,因为之前tx已经commit了。
  2. 我新建一个测试表是为了测试以关键字作表名,我觉得为表名加引号还是比较容易实现的,比处理字段名容易多了:)。我目前手上的项目就有这样的表名,能否先考虑实现表名加引号?
1

@alai04 好的,第一个我改好了,你再拉下最新代码。其实现在测试方法中的create*Table方法中也可以创建关键字名称的表明,比如createInitTable("user")其中user就是关键字。

5

@alai04 老铁怎么关了,有难度么?

7

因为近期有点忙,先放放,不好意思 另外,我发现db.Table(table)里的table如果用 "table1 a" 这样的方式使用别名的话,根本无法执行,这本身就不是关键字的原因。