H2 - Postgres 模式支持网络数据类型
H2 - Postgres mode support net data type
我有一个正在访问 Postgres 数据库的 DAO。我想将 H2 用于我的单元测试 - 一切都很好,除了我正在操作的 table 有一个数据类型为 inet
的列 - 所以我得到了异常
Unknown data type: "inet"; SQL statement: delete from table where id = ? and ip_address = ?::inet [50004-200]
自从我使用 H2 以来已经有一段时间了 - 我已经为连接设置了 Postgres 模式:url jdbc:h2:mem:test;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE
我是否可以在 H2 中执行此查询并支持此数据类型?
这里最大的问题是您的 table 具有未知数据类型是如何创建的?列 ip_address
应具有 H2 已知的一些其他数据类型。
实际上你可以这样创建一个域:
CREATE DOMAIN INET AS VARCHAR;
但是到处使用同一个数据库系统会更好。
像 H2 提供的兼容模式并不完美,它们没有提供 100% 的所有功能覆盖,也没有 100% 相同的行为。
与其在单元测试中使用不同的数据库,并尝试使其尽可能接近(然后无论如何都会被生产中的差异所困扰),我建议使用 PostgreSQL module of testcontainers-java。这允许您为单元测试启动 PostgreSQL docker 个图像。
请注意,这会影响性能,因为启动 docker 图像的时间可能会比使用 H2 慢一点。我建议仔细考虑您的测试是否真的需要进入数据库,或者可以摆脱模拟数据,或者至少限制(需要)进入数据库的测试范围。
我有一个正在访问 Postgres 数据库的 DAO。我想将 H2 用于我的单元测试 - 一切都很好,除了我正在操作的 table 有一个数据类型为 inet
的列 - 所以我得到了异常
Unknown data type: "inet"; SQL statement: delete from table where id = ? and ip_address = ?::inet [50004-200]
自从我使用 H2 以来已经有一段时间了 - 我已经为连接设置了 Postgres 模式:url jdbc:h2:mem:test;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE
我是否可以在 H2 中执行此查询并支持此数据类型?
这里最大的问题是您的 table 具有未知数据类型是如何创建的?列 ip_address
应具有 H2 已知的一些其他数据类型。
实际上你可以这样创建一个域:
CREATE DOMAIN INET AS VARCHAR;
但是到处使用同一个数据库系统会更好。
像 H2 提供的兼容模式并不完美,它们没有提供 100% 的所有功能覆盖,也没有 100% 相同的行为。
与其在单元测试中使用不同的数据库,并尝试使其尽可能接近(然后无论如何都会被生产中的差异所困扰),我建议使用 PostgreSQL module of testcontainers-java。这允许您为单元测试启动 PostgreSQL docker 个图像。
请注意,这会影响性能,因为启动 docker 图像的时间可能会比使用 H2 慢一点。我建议仔细考虑您的测试是否真的需要进入数据库,或者可以摆脱模拟数据,或者至少限制(需要)进入数据库的测试范围。