gpt4 book ai didi

java - Flyway h2 postgressql 模式迁移不起作用

转载 作者:行者123 更新时间:2023-11-30 01:43:18 26 4
gpt4 key购买 nike

我必须遵循在 postgres 中工作的迁移:

ALTER TABLE task_def
DROP COLUMN retry_count,
DROP COLUMN timeout_seconds;

(并在产品中运行)但现在我想切换到 h2 进行单元测试,但 h2 似乎不接受它我在 Spring Boot 中的数据库配置:

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

最佳答案

我没有使用过 H2,但看起来它支持以下功能:

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

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

    总而言之,我认为 H2 无法用它的方言覆盖 postgres 提供的所有功能,因此这样的失败是不可避免的。

    因此,根据我的经验,以下方法效果更好:

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

    关于java - Flyway h2 postgressql 模式迁移不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59154570/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com