使用 Java 代码中的 Flyway 创建新模式

Create new schema using Flyway from Java code

我们在代码库中引入了 Flyway。以前,我们将 Postgres 函数存储在 public 模式中,我们使用它来复制租户模式以创建与租户模式具有相同结构的新模式。回购代码如下:

@Repository
public interface TenantRepository extends JpaRepository<Tenant, UUID> {

        @Query(nativeQuery = true, value = "SELECT clone_schema(:defaultSchema,:newSchema,:isCopyData);")
    String callCloneSchema(@Param("defaultSchema") String defaultSchema, @Param("newSchema") String newSchema,@Param("isCopyData") boolean isCopyData);
}

我想删除这些功能并想使用 Flyway 创建一个新模式。 Flyway是否提供这样的可能性?

以下是用于手动触发个别模式的 Flyway 迁移的一些步骤:

1.禁用“自动迁移”

默认情况下,Spring 引导会自动 运行 Flyway SQL 脚本。所以你必须禁用这个“自动迁移”(参见4.3. in this Blog)。在这里,这是在“Spring Boot main class”中完成的:

@SpringBootApplication                                        
public class FooApplication {                                 
                                                              
    public static void main(String[] args) {                  
        SpringApplication.run(FooApplication.class, args);    
    }                                                         
                                                              
    @Bean                                                     
    public FlywayMigrationStrategy flywayMigrationStrategy() {
        return flyway -> {                                    
            // do nothing                                     
        };                                                    
    }                                                         
                                                              
}                                                             

2。手动迁移

要使用不同的架构自动进行迁移,这是一种解决方案:

  • 注入(默认)Flyway实例
  • 复制配置但覆盖要使用的模式
  • 触发迁移

示例代码:通过 GET 请求触发迁移(SQL 文件在 src/main/resources/db/migration/V#_#_#__xyz.sql 下)

@Controller                                                               
public class FooController {                                              
                                                                          
    @Autowired                                                            
    Flyway flyway;                                                        
                                                                          
    @GetMapping("foo")                                                    
    public ResponseEntity<?> foo(@RequestParam("schema") String schema) { 
        Flyway.configure()                                                
                // apply/use the default (Spring) flyway configiration    
                .configuration(flyway.getConfiguration())                 
                // use the passed schema                                  
                .schemas(schema)                                          
                .defaultSchema(schema)                                    
                // get a Flyway instance                                  
                .load()                                                   
                // run the migration                                      
                .migrate();                                               
        return ResponseEntity.noContent().build();                        
    }                                                                     
                                                                          
}