【发布时间】:2014-03-18 21:55:33
【问题描述】:
我正在尝试测试一个 groovy sql 查询。这个想法是使用 groovy 执行一个 sql 查询,该查询将从遗留的 MS SQL 数据库中提取一些数据,并以我的应用程序可以使用的格式返回它。编写 groovy 脚本很简单,但测试它是另一回事。目前我正在使用 hypersonic 创建一个用于测试的内存数据库。当我的测试运行时,我会创建一个表并尝试使用 xml 文件中的一些测试数据填充它。表创建工作正常,但数据插入失败:“用户缺少权限或找不到对象:GROUP”。
问题似乎是 hsql 正在将我所有的列名都转换为大写。因此,即使实际列名是“Group”,它也会被转换为插入语句的“GROUP”。 GROUP 与 group 关键字冲突,所以查询失败。
我无法控制旧数据库中的列名,因此我需要某种解决方法。有没有办法配置hsql来防止列名转换?
更新: 这是一些示例代码,显示了我在 groovy 中尝试做的事情:
首先我有一个在测试数据库中创建表的初始化方法
Sql remoteDB;
...
remoteDB.execute(
"""create table INFO_GROUP(
"Group" varchar(2) not null primary key,
VALUE varchar(3) null,
GROUP_DATE datetime null,
COMMENT varchar(25) null
)""");
创建表后,我会从 xml 文件中解析一些数据并将其注入到我创建的表中:
groovy.sql.DataSet set = remoteDB.dataSet(tableName);
Node n = it;
Map<String,Object> m = n.attributes() ;
assert(set!=null);
set.add(m);
我看到的问题是我调用 set.add(m) 的最后一行。我收到一个错误:
执行失败:插入 INFO_GROUP (Group, VALUE, GROUP_DATE, COMMENT) 值 (?, ?, ?, ?) 因为:用户缺乏权限或对象 未找到:组
【问题讨论】:
-
HSQLDB 在双引号中保留“组”大小写。 INSERT 语句必须双引号“组”列名,在这种情况下它没有这样做。了解如何让 Groovy 使用正确的表单。
-
Groovy 正在委托给 HSQL,因此要更改表单,我必须在 HSQLDB 中找到一个设置,让我可以控制列名的区分大小写。有人知道怎么做吗?
-
事实证明 fredt 的想法是正确的。问题并非如此,而是缺少引号。一旦我添加了一些代码来用双引号将“组”键包装在我的地图中,问题就消失了。如果您将评论作为答案发表,我会将其标记为解决方案。谢谢!
标签: groovy hsqldb case-sensitive in-memory-database