[spring-projects/spring-boot]记录使用 Flyway 或 Liquibase 时 schema.sql 和 data.sql 仍将运行,但不鼓励使用它们

2024-04-12 566 views
6

预期行为:

  • sql文件“src/main/resources/data.sql”在启动过程中独立于数据库运行
  • sql 文件“src/test/resources/data.sql”在测试开始时独立于数据库运行

实际行为:

  • sql 文件“src/main/resources/data.sql”在启动过程中仅与 h2 一起运行,而不与 postgres 一起运行
  • sql 文件“src/test/resources/data.sql”仅在测试开始时使用 h2 运行,而不是 postgres

失败的方法:

  • 使用属性“spring.datasource.initialization-mode=always”
  • 使用属性“spring.liquibase.drop-first=true”
  • 使用属性“spring.jpa.hibernate.ddl-auto=create-drop”

初步分析:

回答

2

恐怕这是错误的期望。当您使用 Liquibase 运行数据库迁移时,这会控制架构,并且基本schema.sql&data.sql根本不运行。

换句话说,您不能将“启动时执行 Liquibase 数据库迁移” “初始化数据库”结合起来。

后一部分的名称已重命名,2.3.x但我们当然可以改进文档以使其更加明显。

1

好的。但问题就出在 H2 上。因为两者都被执行了。

1

我不知道你所说的“H2 存在缺陷”是什么意思。这个项目在我看来是错误的,因为您使用的是两种不同的初始化系统。您可以使用 liquibase (或 Flyway),也可以使用模式/数据对。

3

它们的行为不同,因为一种是通过 Hibernate 创建模式,另一种则不是。根据文档,如果您使用 JPA,嵌入式数据库会在启动时自动创建。这是一个明智的默认设置,因为数据库及其内容在每次运行时都会被破坏。

我已将以下内容添加到您应用程序的配置中:

spring:
  jpa:
    hibernate:
      ddl-auto: none

为了确保数据库不是由 Hibernate 创建的,现在两个测试以相同的方式失败,因为行为是相同的。这就是我试图通过使用两个竞争的模式管理功能(即 schema.sql 和 data.sql 与 liquibase)来表达的内容。

initialization-mode由于您使用的是 Liquibase,所以 postgres 配置文件中的设置也是always错误的。

2

因此,在嵌入式数据库的情况下,我必须显式禁用休眠创建以避免混淆?感谢您的支持。我很困惑,因为我刚刚更改了数据库。

5

根据 spring.jpa.hibernate.ddl-auto 的文档:

DDL 模式。这实际上是“hibernate.hbm2ddl.auto”属性的快捷方式。使用嵌入式数据库且未检测到模式管理器时默认为“create-drop”。否则,默认为“无”。

所以应该没有必要设置none吧?

我更新了示例,以便清楚地表明,两者都在测试时运行。

5

@hauer-io 无需关闭该问题。我已经对它进行了分类。

所以应该没有必要设置none吧?

这确实是我想要调查的问题的另一部分。我们应该检测 liquibase 和 Flyway。我打算在更详细地研究这个问题的过程中弄清楚到底发生了什么。

长话短说,不要指望能够data.sql与 liquibase (或 Flyway)一起使用。

5

@hauer-io,在你提出问题仅 10 天后我也遇到了类似的问题,这很好奇!

经过一些研究、学习和测试,我同意当前的预期行为。最后,我能够通过正确设置 Liquibase(例如使用“上下文”属性)来实现我的目标,并且最终的解决方案非常干净。

然而,如果两个文档都更加清晰一点,肯定会让一切变得更加简单。我写下了 Spring Boot 文档可能的改进的几点。

9.10.3。初始化数据库

也许值得澄清警告块中的行为。我就想如果是的话将所有内容分组在一个块中会更好。如果我理解正确的话,预期的行为如下:

  • schema.sql并且data.sql无论 JPA/Hibernate 如何使用--> 如果数据源是嵌入式数据库,则始终运行两个脚本(除非您进行更改spring.datasource.initialization-mode)。
  • schema.sqldata.sql与 JPA/Hibernate 一起使用--> 您应该选择是否使用两个脚本或 JPA,作用于spring.jpa.hibernate.ddl-auto
  • schema.sqldata.sql与 Liquibase/Flyway 一起使用--> 不应使用它们,并且您无法通过设置属性来更改此行为。如果您添加 Liquibase/Flyway 并保留文件,它们将被完全忽略。
9.10.5。使用更高级别的数据库迁移工具

也许值得添加一个警告块,提醒迁移脚本将同时运行,main除非tests未通过相应的属性禁用。如果您只想将这些工具用于测试而忘记在 中禁用它们main/resources/application.properties,则可能会遇到一些麻烦。

5. 数据属性

spring.datasource.initialization-mode如果用户首先登陆这里,也许值得为该属性添加一个简短的描述。

2

@nikmanzotti 感谢您的反馈。你能把它变成一个更新文档的 PR 吗?

3

@snicoll 完成,请参阅#21077

2

这似乎是通过#21077 解决的。

4

schema.sql也正在运行。我们现在将更正文档。我们将更改 #22741 中的行为。