可以使用Flyway混合创建和迁移脚本,以便:
E.g。给出:
db/create/V1/V1__schema.sql
db/create/V2/V2__schema.sql
db/create/V3/V3__schema.sql
db/migration/V1/V1.1__migrateA.sql
db/migration/V2/V2.1__migrateB.sql
db/migration/V2/V2.2__migrateC.sql
现有的V1安装将运行以下内容以进入V3:
它永远不会运行以下内容,因为它们代表mysqldump生成的仅模式SQL:
将运行新的V3安装:
上述内容与Upgrade scenario when using Flyway建议的方法存在冲突,但需要填充数据,而与迁移无关。
看起来应该可以使用flyway.locations来支持这一点,但是安装总是需要包含创建脚本的路径,以便Flyway可以看到它。
另一种选择似乎是在Flyway之外运行创建脚本并设置基线,但如果Flyway可以管理所有内容,那将是很好的。
答案 0 :(得分:0)
最后,我开发了一个工具来做到这一点。 该工具具有最新的架构:
db/schema/schema.sql
和迁移脚本:
db/migration/<version>/<version>.<sequence>__<JIRA issue>.sql
e.g:
db/migration/V1/V1.1__JIRA-15.sql
db/migration/V2/V2.1__JIRA-12.sql
db/migration/V2/V2.2__JIRA-22.sql
db/migration/V3/V3.0__JIRA-34.sql
如果数据库没有表格,则执行schema.sql,然后使用最新版本对flyway进行基线化处理,如Flyway所报告的那样 MigrationInfoService.pending()方法。
即。 pending()返回的最后一个MigrationInfo元素确定在调用 Flway.baseline()之前传递给 Flyway.setBaselineVersion()的版本 e.g:
DbSupport support = DbSupportFactory.createDbSupport(connection, true);
Schema schema = support.getOriginalSchema();
if (schema.allTables().length == 0) {
Resource resource = new ClassPathResource("db/schema/schema.sql", getClass().getClassLoader());
SqlScript script = new SqlScript(resource.loadAsString("UTF-8"), support);
script.execute(support.getJdbcTemplate());
MigrationInfo[] pending = flyway.info().pending();
MigrationInfo version = pending.length > 0 ? pending[pending.length - 1] : null;
if (version != null) {
flyway.setBaselineVersion(version.getVersion());
flyway.setBaselineDescription(version.getDecription());
flyway.baseline();
}
}
这确保不会为新创建的数据库调用任何迁移脚本,但这意味着schema.sql必须已包含所有更改。
如果数据库有表格,但没有Flyway信息,则根据检测到的架构版本对其进行基线化。