在工作中,我有一项任务,只需一个查询就可以从位于同一主机上的多个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.dbo
和productDb.dbo
中的名称都是唯一的,则可以在一个H2数据库中创建所有表,并将;IGNORE_CATALOGS=TRUE
附加到JDBC连接URL。
(您也可以使用两个独立的数据库,并使用CREATE LINKED TABLE
命令为每个表创建链接,但链接的表可能会很慢。(
如果您有相同名称的表(来自不同的数据库(,那么在H2中将无法区分它们,像… userDb.dbo.table1 JOIN productDb.dbo.table1 …
这样的联接将引用同一个表dbo.table1
两次。
您也可以在数据库中使用不同的模式名称(dbo
(,在这种情况下,您可以在同一数据库中创建它们,productDb.productDbo.table1
和userDb.userDbo.table1
将具有不同的含义(productDbo.table1
和userDbo.table1
(。
无论如何,如果您在生产中只使用一个DBMS,那么在测试用例中通常应该使用相同的DBMS,最好使用相同的设置。否则,您将不时遇到不同的不兼容性,在某些情况下,在测试中工作的代码可能会失败,甚至在生产数据库中无声地返回不同的结果。当逻辑根本不是数据库特定的时,使用另一个DBMS进行某些测试可能会有各种有效的用例,但即使在这些用例中也可能出现一些偏差。