我必须在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

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

  ask by Robert Stevens translate from so

===============>>#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

本文未有回复,本站智能推荐: