簡體   English   中英

使用 R2DBC 進行數據庫遷移

[英]Database migrations with R2DBC

我是 R2DBC ( https://r2dbc.io/ ) 的新手。 我想知道r2dbc的生態系統是否有數據庫遷移工具/框架。

似乎 Liquibase & Flyway 依賴於 JDBC。 是否有計划允許這些框架支持 r2dbc 驅動程序?

歡迎任何輸入或反饋。

Steve 的回答是正確的,因為 R2DBC 主要是關於與實際數據的交互。 我想補充一個不同的觀點。

確實,響應式 API 在遷移期間不會提供任何改進。 事實上,仔細觀察,遷移是啟動過程的一部分,它通常是同步的,至少在某種程度上是同步的。

需要 JDBC 進行遷移增加了這種應用程序安排的復雜性。 您需要將 JDBC 驅動程序包含到現有的 R2DBC 設置中,並且您需要配置另一個指向與 R2DBC 相同的數據庫的數據庫連接。 這兩個要求都容易出錯,因為它們需要配置為做完全相同的事情。

如今,當某個庫從類路徑可用時,應用程序配置框架(Spring Boot、Micronaut、Quarkus)會激活功能。 使用 JDBC 驅動程序配置引導功能,這些功能不是應用程序必需的,但在引導過程中是必需的,這有點浪費資源。

理想情況下,您可以配置一個單一的數據庫連接技術,該技術可重復用於架構遷移和應用程序中以后的數據交互。

因此它是有道理的問Liquibase遷飛提供基於R2DBC整合。

在我看來(從 R2DBC 網頁的首頁粗略一瞥),R2DBC 的目標確實與遷移無關。 該頁面列出了以下主要功能:

  • Reactive Streams - R2DBC 建立在 Reactive Streams 上,提供了一個完全反應性的非阻塞 API。
  • 關系數據庫 - R2DBC 將 SQL 數據庫與反應式 API 結合使用,這是 JDBC 的阻塞性質所不可能實現的。
  • 可擴展的解決方案 - Reactive Streams 使從經典的每個連接一個線程的方法轉變為更強大、更具可擴展性的方法成為可能。

沒有任何內容可以保證向 Liquibase 這樣的框架添加 R2DBC 支持。 當前使用的 JDBC 驅動程序不會受到使用非阻塞 API 的影響,不需要“反應式 API”,並且幾乎可以肯定每個連接不需要一個以上的線程。

遷移工具主要關注數據庫的形狀/結構而不是內容,而 R2DBC 則針對主要關心實際數據的應用程序。

總而言之,我看不出有人會因為他們的應用程序使用 R2DBC 而不會使用像 Liquibase 這樣使用 JDBC 的遷移工具的任何理由,而且我認為將 R2DBC 支持添加到像 Liquibase 這樣的工具沒有任何好處。

你可以試試我的包r2dbc-migrate

在最小配置中(假設您使用的是 Spring Boot 2.3.0.M3),只需添加

<dependency>
  <groupId>name.nkonev.r2dbc-migrate</groupId>
  <artifactId>r2dbc-migrate-spring-boot-starter</artifactId>
  <version>0.0.24</version>
</dependency>

到 pom.xml

然后在類路徑中添加 .sql 文件,例如在/db/migration/

然后加

r2dbc.migrate.resourcesPath: classpath:/db/migration/*.sql

到您的 application.yml

以上兩個答案都是正確的 - 只是想補充一點,如果您正在尋找快速簡便的路徑並且您正在使用 maven,那么 Flyway 可能是最方便的操作方式。

您只需要 Flyway Maven 插件、兩個 pom 依賴項和遷移 sql 腳本。

例如。 假設 spring - r2dbc - postgresql 您只需三個簡單的步驟就可以准備好遷移基礎設施:

(1) 為資源添加遷移腳本:

resources/db/migration/V1_init.sql

(2) 給pom添加兩個依賴

    <dependency>
        <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
    </dependency>

(3) 和構建部分中的一個插件定義:

    <plugin>
        <groupId>org.flywaydb</groupId>
           <artifactId>flyway-maven-plugin</artifactId>
           <version>6.0.0-beta2</version>
    </plugin>

現在你有一個單獨的 maven CLI 命令來遷移:

    mvn flyway:migrate -Dflyway.url=jdbc:postgresql://localhost:5432/test -Dflyway.user=test -Dflyway.password=test

在此處查看更多 Flyway maven 插件文檔

如果有人面臨同樣的問題並且不想使用maven-flyway-plugin ,請查看FlywayAutoConfiguration類。 它有@Conditional(FlywayDataSourceCondition.class) ,里面有@ConditionalOnBean(DataSource.class) 因此,底線是你應該提供一個非反應性的數據庫環境來使 Flyway 工作。 最直接的解決方案是做這樣的事情:

@Configuration
public class DataBaseConfig extends AbstractR2dbcConfiguration {

    @Value("${spring.data.postgres.host}")
    private String host;
    @Value("${spring.data.postgres.port}")
    private int port;
    @Value("${spring.data.postgres.database}")
    private String database;
    @Value("${spring.data.postgres.username}")
    private String username;
    @Value("${spring.data.postgres.password}")
    private String password;

    @Bean
    public DatabaseClient databaseClient() {
        return DatabaseClient.create(connectionFactory());
    }

    @Bean
    @Override
    public PostgresqlConnectionFactory connectionFactory() {
        PostgresqlConnectionConfiguration config = PostgresqlConnectionConfiguration.builder()
                .host(host)
                .port(port)
                .database(database)
                .username(username)
                .password(password)
                .build();
        return new PostgresqlConnectionFactory(config);
    }

    @Bean
    public DataSource dataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.postgresql.Driver");
        dataSourceBuilder.url("jdbc:postgresql://" + host + ":" + port + "/" + database);
        dataSourceBuilder.username(username);
        dataSourceBuilder.password(password);
        return dataSourceBuilder.build();
    }
}

我這樣做是因為我不想:1)在每次啟動時運行插件; 2)在命令行中傳遞數據庫屬性

拜托,最終有一個解決方案,至少是一個臨時解決方案,因為目前還沒有 Flyway 官方解決方案(我相信很快我們就會看到正式版本)。

請查看我的帖子: https : //stackoverflow.com/a/62864838/7681696

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM