Select 在 H2 中但带有数据库前缀

Select in H2 but with database prefix

在工作中,我有一项任务是从位于同一台主机上的多个 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 不支持这样的数据库。查询失败并显示“未找到架构 productDb”。虽然 productDb 应该是数据库,但架构是 dbo,table 是 productTable。

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

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

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

如果你有table同名的(来自不同的数据库),在H2中将无法区分它们,join like … userDb.dbo.table1 JOIN productDb.dbo.table1 …将引用相同的table dbo.table1两次。

您还可以在数据库中使用不同的架构名称 (dbo),在这种情况下,您可以在同一个数据库中创建它们,productDb.productDbo.table1userDb.userDbo.table1 会有不同意思是(productDbo.table1userDbo.table1)。

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