我是R2DBC(https://r2dbc.io/)的新手。我想知道r2dbc的生态系统是否具有数据库迁移工具/框架。
似乎Liquibase和Flyway依赖JDBC。是否有计划允许那些框架支持r2dbc驱动程序?
欢迎任何输入或反馈。
答案 0 :(得分:3)
在我看来(从R2DBC网站首页的粗略浏览看)R2DBC的目标确实与迁移没有任何关系。该页面列出的主要功能如下:
这里没有什么东西可以保证向像Liquibase这样的框架添加R2DBC支持。当前使用的JDBC驱动程序不会因使用非阻塞API而受苦,实际上并不需要“反应性API”,并且几乎可以肯定每个连接不需要多个线程。
迁移工具主要与数据库的形状/结构有关,而不与内容有关,而R2DBC则针对主要关心实际数据的应用程序。
总而言之,我看不出有人会因为他们的应用程序使用R2DBC而不会使用使用JDBC的迁移工具(例如JDBC)的任何原因,而且我看不出将R2DBC支持添加到诸如液基。
答案 1 :(得分:2)
Steve的答案是正确的。R2DBC主要是与实际数据进行交互。我想添加一个不同的观点。
的确,反应式API不会在迁移期间提供任何改进。实际上,仔细观察一下,迁移是启动过程的一部分,通常是同步的,至少在某种程度上是同步的。
要求JDBC进行迁移会增加这种应用程序安排的复杂性。您需要在现有R2DBC设置中包括JDBC驱动程序,并且需要配置另一个数据库连接,该连接指向与R2DBC相同的数据库。这两个要求都容易出错,因为需要对其进行配置以使其完全相同。
现在,当类路径中有某个库可用时,应用程序配置框架(Spring Boot,Micronaut,Quarkus)会激活功能。配置JDBC驱动程序会引导应用程序不需要的功能,但在引导过程中将需要该功能,这会浪费资源。
理想情况下,您配置一种数据库连接技术,该技术可用于架构迁移和应用程序内部的以后数据交互。
答案 2 :(得分: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
答案 3 :(得分:0)
以上两个答案都是正确的-只是想补充一点,如果您正在寻找快速简便的路径并且正在使用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插件文档here
答案 4 :(得分:0)
如果任何人遇到相同的问题并且不想使用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)在命令行中传递数据库属性
答案 5 :(得分:0)
请解决,最后有一个解决方案,至少是一个临时解决方案,因为还没有Flyway官方解决方案(我相信很快我们会看到一个正式版本)。