Java H2 postgresql模式似乎不适合我
我的应用程序访问Postgres数据库,我有许多预定义的查询(排名、分区、复杂连接等),我会对Postgres进行查询。现在我想用小测试数据对这些查询进行单元测试。所以我从H2/JUnit开始。我发现大多数Postgres查询都像秩、分区、更新时的复杂情况等。因此我考虑使用H2 PosgreSQL兼容模式,因为我认为所有Postgres查询都可以在H2上工作。如果我错了,请纠正我 我接着说: 要使用PostgreSQL模式,请使用数据库URL jdbc:h2:~/test;MODE=PostgreSQL或SQL语句集MODE-PostgreSQL 我使用Java H2 postgresql模式似乎不适合我,java,postgresql,jdbc,h2,Java,Postgresql,Jdbc,H2,我的应用程序访问Postgres数据库,我有许多预定义的查询(排名、分区、复杂连接等),我会对Postgres进行查询。现在我想用小测试数据对这些查询进行单元测试。所以我从H2/JUnit开始。我发现大多数Postgres查询都像秩、分区、更新时的复杂情况等。因此我考虑使用H2 PosgreSQL兼容模式,因为我认为所有Postgres查询都可以在H2上工作。如果我错了,请纠正我 我接着说: 要使用PostgreSQL模式,请使用数据库URL jdbc:h2:~/test;MODE=Postgr
SET mode PostgreSQL
启用了模式,并尝试触发一个查询,该查询涉及rank()
并在Postgres中工作,但不起作用。它给了我以下例外情况:
Function "RANK' not found; in SQL statement
请指导我是H2和数据库测试的新手。提前谢谢。我使用H2 JDBC驱动程序启动Postgres查询,因为我认为H2 Posgres兼容模式将允许我启动Postgres查询
所以我想使用H2 PosgreSQL兼容模式,因为我认为所有postgres查询都可以在H2上运行。如果我错了,请纠正我
恐怕那不是真的
H2尝试模拟PostgreSQL语法并支持一些特性和扩展。它永远不会完全符合PostgreSQL的行为,也不支持所有功能
您唯一的选择是:
- 使用PostgreSQL进行测试;或
- 停止使用H2不支持的功能
initdb
s创建一个新的PostgreSQL并启动它;然后,拆卸代码将杀死邮局主管并删除datadir。我写了更多关于这方面的文章
另见:
如果我正确地理解了您的意思,那么是的,就是这样-如果您的其余代码使用PostgreSQL中的数据集,那么它通常应该使用包含来自另一个数据库的相同数据的数据集。当然,只要它使用的是简单的数据类型,而不是特定于数据库的功能。阅读类似问题的注释,您可能会觉得很有趣。无论如何,我会站在人们一边,主张如果你的应用程序实际使用PostgreSQL,那么你也应该简单地使用PostgreSQL进行测试。Hi@Gord我希望我可以使用Posgres,但作为单元测试的一部分,我应该使用内存数据库,如H2。作为集成测试的一部分,我可以使用Postgres。当你使用数据库时,这不是单元测试……嗨@Craig,谢谢你的回复。我不能停止使用诸如rank()之类的窗口函数,所以你的意思是我不能在postgres兼容模式下使用H2作为rank。大多数内存中的数据库都不支持窗口函数,如果它对您的项目非常重要的话,您可以在H2中实现窗口函数。这不容易也不快。就我个人而言,我建议只在Pg上进行测试。我不清楚为什么不能在单元测试中这样做。当然,这很不方便,但总比不测试你将运行的同一个东西要好。即使我同意你的观点,但人们说我不应该在真实的数据库上做单元测试,比如Postgres,我应该在内存数据库中使用H2来做这件事。如果我像Postgres一样使用真正的db,那将是集成测试而不是单元测试。我对数据库测试还不熟悉,所以有点迷茫?参考/链接?听起来像是BS t