数据库迁移

数据库迁移是通常在应用程序启动时应用的 DDL 更改。

Ebean 可以通过对模型执行 diff,然后生成针对特定数据库平台的 DDL 更改来为我们生成迁移。

Ebean 还可以运行迁移(类似于 FlywayDb)。建议使用 Ebean 内置的迁移运行程序,而不是 FlywayDbLiquiBase

依赖项

将 ebean-test 添加为测试范围依赖项(其中包括 ebean-ddl-generator 和其他依赖项)。

<dependency>
  <groupId>io.ebean</groupId>
  <artifactId>ebean-test</artifactId>
  <version>13.25.0</version>
  <scope>test</scope>
</dependency>

或将 ebean-ddl-generator 添加为测试范围依赖项。

<dependency>
  <groupId>io.ebean</groupId>
  <artifactId>ebean-test</artifactId>
  <version>13.25.0</version>
  <scope>test</scope>
</dependency>

生成迁移

src/test/java 中添加代码以生成迁移。第一个示例为单个数据库平台(本例中为 Postgres)生成数据库迁移。

package main;

import io.ebean.annotation.Platform;
import io.ebean.dbmigration.DbMigration;
import java.io.IOException;

public class MigrationGenerator {

  /**
   * Generate the next "DB schema DIFF" migration.
   */
  public static void main(String[] args) throws IOException {

    DbMigration dbMigration = DbMigration.create();
    dbMigration.setPlatform(Platform.POSTGRES);

    dbMigration.generateMigration();
  }
}
import io.ebean.annotation.Platform
import io.ebean.dbmigration.DbMigration

fun main() {
  DbMigration.create().apply {
    setPlatform(Platform.POSTGRES)
  }.generateMigration()
}

多平台迁移生成

要为多个不同的数据库平台生成迁移,我们对要为其生成迁移的每个平台使用 addPlatform()。在下面的示例中,我们为 Postgres、SqlServer 和 MySql 生成迁移。

...
public class MigrationGenerator {

  /**
   * Generate the next "DB schema DIFF" migration.
   */
  public static void main(String[] args) throws IOException {

    DbMigration dbMigration = DbMigration.create();

    dbMigration.addPlatform(Platform.POSTGRES);
    dbMigration.addPlatform(Platform.SQLSERVER17);
    dbMigration.addPlatform(Platform.MYSQL);

    dbMigration.generateMigration();
  }
}
...
fun main() {
  DbMigration.create().apply {
    addPlatform(Platform.POSTGRES)
    addPlatform(Platform.SQLSERVER17)
    addPlatform(Platform.MYSQL)
  }.generateMigration()
}

运行主方法以生成数据库迁移。如果没有更改,则不会生成迁移。如果模型已更改,则会针对模型的 DIFF 生成数据库迁移。

运行生成会以脱机模式启动 Ebean(我们不需要运行数据库来生成迁移)。Ebean 对模型执行 DIFF,并为我们指定的平台生成迁移 DDL 脚本。

默认情况下,生成的迁移会进入 src/main/resources/dbmigration

运行迁移

让 Ebean 在启动时运行数据库迁移

1. 将 ebean.migration.run 设置为 true

通过属性 - 例如 application.properties
## run migrations when the Ebean starts
ebean.migration.run=true
通过 yaml - 例如 application.yaml
## run migrations when the Ebean starts
ebean:
  migration:
    run: true

2. 添加 ebean-migration 依赖项

如果尚未添加,请将 io.ebean:ebean-migration 添加为依赖项。

<dependency>
  <groupId>io.ebean</groupId>
  <artifactId>ebean-migration</artifactId>
  <version>13.6.0</version>
</dependency>

如果 ebean.migration.run=true,则当 Ebean 启动时,它会查看迁移并运行任何需要运行的迁移。默认情况下,迁移运行程序会创建一个名为 db_migration 的表,该表保存已运行的迁移的元数据,并在成功执行迁移时将数据插入此表中。