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

Posted

技术标签:

【中文标题】从 Java 代码中使用 Flyway 创建新模式【英文标题】:Create new schema using Flyway from Java code 【发布时间】:2021-04-20 10:02:39 【问题描述】:

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

@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 是否提供这种可能性?

【问题讨论】:

这个答案有帮助吗? ***.com/a/60239471/4214241 @R.G 不是,我想使用 Flyway 创建一个新的模式运行时 【参考方案1】:

以下是一些用于手动触发具有单个架构的 Flyway 迁移的步骤:

1.禁用“自动迁移”

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

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

【讨论】:

以上是关于从 Java 代码中使用 Flyway 创建新模式的主要内容,如果未能解决你的问题,请参考以下文章

自动生成 Flyway 的迁移 SQL

Flyway spring boot + java,由hibernate创建的新本地数据库,但现在迁移尝试应用已经发生的迁移

flyway 在初始模式创建后不创建模式

如何使用flyway创建数据库?

如何创建具有快照隔离级别的 Flyway 模式历史记录?

Flyway迁移,无法从DataSource获取Jdbc连接