数据库迁移
数据库迁移是通常在应用程序启动时应用的 DDL 更改。
Ebean 可以通过对模型执行 diff
,然后生成针对特定数据库平台的 DDL 更改来为我们生成迁移。
Ebean 还可以运行迁移(类似于 FlywayDb)。建议使用 Ebean 内置的迁移运行程序,而不是 FlywayDb
或 LiquiBase
。
依赖项
将 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
的表,该表保存已运行的迁移的元数据,并在成功执行迁移时将数据插入此表中。