Postgresql H2-Postgres模式支持网络数据类型

Postgresql H2-Postgres模式支持网络数据类型,postgresql,jdbc,h2,Postgresql,Jdbc,H2,我有一个正在访问Postgres数据库的DAO。我想在我的单元测试中使用H2——除了我正在操作的表有一个带有inetdatatype的列之外,一切都很好——所以我得到了一个异常 未知数据类型:“inet”;SQL语句:从id=?和ip_地址=?::inet[50004-200] 我已经有一段时间没有使用H2了——我已经为连接设置了Postgres模式:urljdbc:H2:mem:test;模式=PostgreSQL;数据库\u至\u下限=真 我是否可以在H2中执行此查询并支持此数据类型?这里最

我有一个正在访问Postgres数据库的DAO。我想在我的单元测试中使用H2——除了我正在操作的表有一个带有
inet
datatype的列之外,一切都很好——所以我得到了一个异常

未知数据类型:“inet”;SQL语句:从id=?和ip_地址=?::inet[50004-200]

我已经有一段时间没有使用H2了——我已经为连接设置了Postgres模式:url
jdbc:H2:mem:test;模式=PostgreSQL;数据库\u至\u下限=真


我是否可以在H2中执行此查询并支持此数据类型?

这里最大的问题是如何创建具有未知数据类型的表?列
ip\u地址
应具有H2已知的其他数据类型

实际上,您可以创建如下域:

将域INET创建为VARCHAR;

但是在任何地方使用相同的数据库系统都会更好。

这里最大的问题是如何创建具有未知数据类型的表?列
ip\u地址
应具有H2已知的其他数据类型

实际上,您可以创建如下域:

将域INET创建为VARCHAR;

但是在任何地方使用相同的数据库系统都会更好。

H2提供的兼容性模式并不完美,它们不能提供100%的功能覆盖率,也不能提供100%相同的行为

与其在单元测试中使用不同的数据库,并尝试使其尽可能接近(然后被生产中的差异所困扰),我建议使用。这允许您为单元测试加速PostgreSQL docker映像


请注意,这将影响性能,因为由于启动docker映像所需的时间,这可能会比使用H2慢一点。我建议仔细考虑你的测试是否真的需要进入数据库,或者可以通过嘲弄数据来逃避,或者至少限制需要去数据库的测试范围。

H2所提供的兼容性模式并不完美,它们不能提供所有特征的100%覆盖,也不能提供100%种相同的行为。 与其在单元测试中使用不同的数据库,并尝试使其尽可能接近(然后被生产中的差异所困扰),我建议使用。这允许您为单元测试加速PostgreSQL docker映像


请注意,这将影响性能,因为由于启动docker映像所需的时间,这可能会比使用H2慢一点。我建议仔细考虑您的测试是否真的需要进入数据库,或者可以通过嘲弄数据来逃避,或者至少限制测试(需要)到数据库的范围。

<代码>创建表Mytable(IpIdApple NETID,ID INT NULL NULL)< /COD>是用于创建表的SQL -导致<代码>未知数据类型:“inet”;SQL语句error我在创建上述表之前运行了
create domain inet as varchar
,遇到了相同的错误-因为create的返回值为false-必须找出该命令失败的原因
create domain inet as varchar;create table myTable(ip_address inet,id INT NOT NULL);
在H2中完成,没有任何异常。我希望我有同样的运气。我正在使用Scalike JDBC-
使用(inMemoryPool.借入()){conn=>val db:db=db(conn)db.localTx{implicit session=>val inetCreated=sql”““将域inet创建为varchar”“”。execute().apply()println(inetCreated)//false sql“”“创建表mytable(ip地址inet,id INT NOT NULL)”。execute.apply()}
--创建域的结果是错误的,随后的创建表失败使用普通JDBC,在H2控制台中一切正常,但我无法帮助您使用包装器;我不熟悉它。
创建表myTable(ip\U地址inet,id INT not NULL)
是用于创建表的sql-导致
未知数据类型:“inet”"; SQL语句
error我在创建上述表之前运行了
create domain inet as varchar
,遇到了相同的错误-因为create的返回值为false-我必须找出该命令失败的原因
create domain inet as varchar;创建表myTable(ip_地址inet,id INT不为空)在H2中完成,没有任何异常。我希望我也有同样的运气。我使用的是Scalike JDBC-
使用(inMemoryPool.借入()){conn=>val-db:db=db(conn)db.localTx{implicit session=>val-inetCreated=sql”““将域inet创建为varchar”“”。execute().apply()println(inetCreated)//false-sql”“”创建表mytable(ip地址inet,id INT NOT NULL)“”。执行。应用()}<代码> >域的创建结果是错误的,随后的创建表失败与普通JDBC和H2控制台都很好,但我不能帮助您使用包装器;我不熟悉它。考虑使用类似于TestBasejava的PostgreSQL模块的东西,而不是尝试使用不同的数据库FO。r你的单元测试。@Markrotterveel brilliant,谢谢。我试过zonky embedded Postgres,但它不能建立在Jenkins的基础上,而且项目没有提供任何可操作的输出,因此没有关于出错原因的指导。测试容器工作得很好。你能把这个作为一个答案发布出来,让我接受吗考虑使用类似t的postgresql模块estcontainers java,而不是尝试使用不同的数据库进行单元测试。@MarkrotVeel brilliant,谢谢。我尝试了zonky embedded Postgres,但它无法在Jenkins上构建,而且该项目没有提供任何可操作的输出,因此没有关于出错原因的指导。测试容器工作得很好。你能将此作为一个示例发布吗