R2DBCは初めてです( https://r2dbc.io/ )。 r2dbcのエコシステムにデータベース移行ツール/フレームワークがあるかどうかを知りたいです。
LiquibaseとFlywayはJDBCに依存しているようです。それらのフレームワークがr2dbcドライバーをサポートできるようにする計画はありますか?
どんな入力やフィードバックも歓迎します。
Steveの答えは正解です。R2DBCは主に実際のデータとの相互作用についてです。別の視点を追加したいと思います。
移行中、リアクティブAPIが改善をもたらさないのは事実です。実際、よく見ると、移行は起動プロセスの一部であり、通常は同期しており、少なくともある程度は同期しています。
移行にJDBCが必要になると、このようなアプリケーションの配置がさらに複雑になります。既存のR2DBCセットアップにJDBCドライバーを含める必要があり、R2DBCと同じデータベースを指す別のデータベース接続を構成する必要があります。両方の要件は、まったく同じことを行うように構成する必要があるため、エラーが発生しやすくなります。
現在、特定のライブラリがクラスパスから利用可能になると、アプリケーション構成フレームワーク(Spring Boot、Micronaut、Quarkus)が機能をアクティブにします。 JDBCドライバーを構成すると、アプリケーションには必要ありませんが、ブートストラップ中に必要な機能が起動します。これは、リソースの浪費のようなものです。
理想的には、スキーマの移行やアプリケーション内での後のデータ対話に再利用される単一のデータベース接続テクノロジーを構成します。
したがって、R2DBCベースの統合を提供するために Liquibase および Flyway を要求することは理にかなっています。
(R2DBC Webページのフロントページをざっと一目見ただけで)R2DBCの目標が実際に移行に関係していることは、私には思えません。このページには、主な機能が次のようにリストされています。
LiquibaseのようなフレームワークにR2DBCサポートを追加することを保証するものは何もありません。現在使用中のJDBCドライバーは、ノンブロッキングAPIの使用による影響を受けず、「リアクティブAPI」を実際に必要とせず、ほとんどの場合、接続ごとに複数のスレッドを必要としません。
移行ツールは主にデータベースの形状/構造に関係し、コンテンツには関係しませんが、R2DBCは主に実際のデータに関心があるアプリケーションを対象としています。
要約すると、アプリケーションがR2DBCを使用しているという理由だけで、JDBCを使用するLiquibaseのような移行ツールを使用しない理由はありません。また、LiquibaseのようなツールにR2DBCサポートを追加する利点もありません。
誰かが同じ問題に直面し、_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)コマンドラインでデータベースプロパティを渡します
私のパッケージ 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プラグイン、2つのpom依存関係、および移行SQLスクリプトだけです。
例えば。春-r2dbc-postgresqlを想定すると、3つの簡単な手順で移行インフラストラクチャを準備できます。
(1)移行スクリプトをリソースに追加します。
resources/db/migration/V1_init.sql
(2)pomに2つの依存関係を追加する
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
(3)およびビルドセクションの1つのプラグイン定義:
<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プラグインのドキュメントをもっと見る こちら