我必须在postgres中进行以下迁移:

ALTER TABLE task_def
  DROP COLUMN retry_count,
  DROP COLUMN timeout_seconds;

(并在prod中运行),但是现在我想切换到h2进行单元测试,但是h2似乎不接受它。

spring.datasource.url=jdbc:h2:./target/testdb;MODE=PostgreSQL
spring.datasource.username="sa"
spring.datasource.password=""
spring.jpa.hibernate.ddl-auto=none
spring.datasource.driver-class-name=org.postgresql.Driver

spring.flyway.url=jdbc:h2:./target/testdb;MODE=PostgreSQL
spring.flyway.user="sa"
spring.flyway.password=""
spring.flyway.schemas=

错误:

 Migration V3__.....sql failed
---------------------------------------
SQL State  : 42S22
Error Code : 42122
Message    : Column "DROP" not found; SQL statement:
ALTER TABLE task_def
  DROP COLUMN retry_count,
  DROP COLUMN timeout_seconds [42122-200]
Location   : db/migration/V3__.....sql
Line       : 1
Statement  : ALTER TABLE task_def
  DROP COLUMN retry_count,
  DROP COLUMN timeout_seconds

===============>>#1 票数:1

没有一种可移植的方式一次删除多列, ALTER TABLE … DROP COLUMN是标准命令,但仅适用于一列。

但是,某些数据库(包括PostgreSQL和H2)支持这种非标准功能,但是它们的语法不同。 PostgreSQL期望

ALTER TABLE tableName DROP COLUMN columnName1, DROP COLUMN columnName2, …

https://www.postgresql.org/docs/12/sql-altertable.html

H2期望

ALTER TABLE tableName DROP COLUMN columnName1, columnName2, …

https://h2database.com/html/commands.html#alter_table_drop_column

如果使用其他数据库,则应尽可能避免使用非便携式命令。

===============>>#2 票数:1 已采纳

我尚未使用H2,但它似乎支持以下内容:

  1. 2条语句,而不是同一迁移中的一条语句(flyway无论如何应在同一事务中运行它们):
ALTER TABLE task_def DROP COLUMN retry_count;
ALTER TABLE task_def DROP COLUMN timeout_seconds;
  1. 使用不同的语法:
ALTER TABLE task_def DROP COLUMN retry_count, timeout_seconds;

当然,如果postgresql也允许这样做的话。

总而言之,我不认为H2能够用方言涵盖Postgres提供的所有功能,因此无法避免这样的失败。

因此,以我的经验,以下方法会更好:

创建一个postgres的“测试容器”(请参阅testcontainers项目),并配置flyway /数据源以在测试中针对它运行。 根据您的测试基础结构,您甚至不能停止容器,而是在每个测试用例之前删除数据库并运行flyway。 或者,您也可以像在春季测试中那样做-在运行测试之前创建一个人工事务,并在测试完成时(即使它成功完成)“失败”,这样数据库就不会在下一次测试中变脏。

  ask by Robert Stevens translate from so

未解决问题?本站智能推荐: