在H2中选择,但带有数据库前缀



在工作中,我有一项任务,只需一个查询就可以从位于同一主机上的多个MSSQL数据库中查询数据。它运行良好,看起来像这样:

SELECT
user.name as userName,
product.name as productName
FROM
userDb.dbo.userTable user 
INNER JOIN productDb.dbo.productTable product on user.id = product.buyer
WHERE user.id = ?

然而,当我想扩展使用模拟H2数据库的端到端测试解决方案时,我意识到H2不支持这样的数据库。查询失败,返回"0";未找到架构productDb";。虽然productDb应该是数据库,但架构是dbo,表是productTable。

有没有办法在H2中绕过这一点,或者我需要对单独的数据库进行两次单独的调用,然后将结果合并在一起,只用于测试?

如果userDb.dboproductDb.dbo中的名称都是唯一的,则可以在一个H2数据库中创建所有表,并将;IGNORE_CATALOGS=TRUE附加到JDBC连接URL。

(您也可以使用两个独立的数据库,并使用CREATE LINKED TABLE命令为每个表创建链接,但链接的表可能会很慢。(

如果您有相同名称的表(来自不同的数据库(,那么在H2中将无法区分它们,像… userDb.dbo.table1 JOIN productDb.dbo.table1 …这样的联接将引用同一个表dbo.table1两次。

您也可以在数据库中使用不同的模式名称(dbo(,在这种情况下,您可以在同一数据库中创建它们,productDb.productDbo.table1userDb.userDbo.table1将具有不同的含义(productDbo.table1userDbo.table1(。

无论如何,如果您在生产中只使用一个DBMS,那么在测试用例中通常应该使用相同的DBMS,最好使用相同的设置。否则,您将不时遇到不同的不兼容性,在某些情况下,在测试中工作的代码可能会失败,甚至在生产数据库中无声地返回不同的结果。当逻辑根本不是数据库特定的时,使用另一个DBMS进行某些测试可能会有各种有效的用例,但即使在这些用例中也可能出现一些偏差。

相关内容

  • 没有找到相关文章

最新更新