当前位置: 首页 > 知识库问答 >
问题:

将创建和迁移脚本与飞行路线混合

陆城
2023-03-14

Flyway是否可以用于混合创建和迁移脚本,以便:

  • 安装运行架构创建脚本
  • 现有安装运行迁移脚本,并且永远看不到后续版本的创建脚本

?

例如给定:

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:

  • 数据库/迁移/V1/V1.1__migrateA.sql
  • 数据库/迁移/V2/V2.1__migrateB.sql
  • 数据库/迁移/V2/V2.2__migrateC.sql

它永远不会运行以下内容,因为它们表示由 mysql 转储生成的仅架构 SQL:

  • 数据库/创建/V2/V2__schema.sql
  • 数据库/创建/V3/V3__schema.sql

新的 V3 安装将运行:

    < Li > db/create/V3/V3 _ _ schema . SQL

上述方法与使用 Flyway 时升级方案建议的方法冲突,但是必需的,因为数据是独立于迁移填充的。

看起来应该可以使用flyway.locations来支持这一点,但是安装总是需要包含创建脚本的路径,以便Flyway可以看到它。

替代方案似乎是在Flyway之外运行创建脚本并设置基线,但如果Flyway可以管理一切就更好了。

共有1个答案

王季萌
2023-03-14

最后,我开发了一个工具来做到这一点。该工具具有最新的模式:

db/schema/schema.sql

和中的迁移脚本:

db/migration/<version>/<version>.<sequence>__<JIRA issue>.sql

例如:

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的MigrationInfoService报告,使用最新版本对flyway进行基线化。pending()方法。

即,pending()返回的最后一个MigrationInfo元素确定在调用Flway.baseline()之前要传递给Flyway.setBaselineVersion()的版本,例如:

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();
  }
}

这可确保不会为新创建的数据库调用任何迁移脚本,但确实意味着架构.sql必须已包含所有更改。

如果数据库有表,但没有Flyway信息,则根据检测到的模式版本对其进行基线化。

 类似资料:
  • 有没有办法告诉flyway在不应用迁移的情况下重新创建flyway表。例如,查看迁移文件夹中的脚本,假设它们都已应用,并简单地确保flyway表包含所有脚本。 我们的方案是,我们不允许在生产和(ISO;银行、认证)原因。规则说我们需要完全删除表。因此,当我们从生产副本重置测试环境时,我们需要重新创建飞行道表。现在,我们从现有的测试环境中复制和粘贴,但有时这与生产不同步,并且会发生各种问题。 因此,

  • 我们使用Liquibase,现在在新项目中,我们必须使用Flyway。在liquibase中,迁移顺序在xml文件中,所以您可以指定什么是第一次迁移,什么是第二次迁移,它不依赖于名称。 所以,当一些开发人员添加新的迁移时,如果之前有人推动了新的迁移,那么他将在Git中遇到冲突,并且必须修复顺序。 这是如何在Flyway中实现的?如果并行添加迁移,如何控制顺序?

  • 在类路径中:/db。迁移有迁移但flyway没有看到这一点,而是爱上了msg 2022-05-02 17:28:07.993INFO 45296 --- [ restartedMain]c. c. c. ConfigServiceProperty tySourceLocator:从服务器获取配置,地址为:http://localhost:8888/story2022-05-02 17:28:08.

  • 我正在使用Spring启动1.4.1.发布与飞行方式。 执行模式迁移时,Flyway无法执行DML脚本。 我的资源文件夹具有以下结构 的飞行方式: 在空数据库上执行 Flyway 可以正常工作。它为数据库创建架构和数据。 但是一旦应该执行架构迁移(即 DML 和 DDL 脚本中的更改),Flyway 将显示以下错误消息: 我的应用程序开发属性如下所示:

  • 创建迁移脚本 生成一个迁移脚本框架 让我们从创建一个新的 Phinx 迁移脚本开始。使用 create 命令: $ php vendor/bin/phinx create MyNewMigration 这将创建一个新的迁移脚本,格式是 YYYYMMDDHHMMSS_my_new_migration.php ,前14个字符是当前的timestamp,精确到秒。 如果你指定了多个脚本路径,将会提示你

  • 我为命令行java迁移执行了以下步骤: < li >创建java文件 当我执行迁移逗号时,它会像 警告:无法解析位置类路径:db/迁移 请查看下面的附件图片,它实际上是罐子。我已经提取了更多信息。