首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring data r2dbc可以生成模式吗?

spring data r2dbc可以生成模式吗?
EN

Stack Overflow用户
提问于 2019-11-04 04:03:23
回答 3查看 4.6K关注 0票数 7

我正在使用R2DBC和H2创建一个快速项目,以熟悉这些新的反应性内容。创建了一个扩展ReactiveCrudRepository的存储库,只要我使用这个DatabaseClient发出一个与我的实体匹配的CREATE TABLE语句就可以了……

据我所知,spring data R2DBC没有spring data JPA功能齐全(还好吗?)但是,目前是否有一种方法可以从实体类生成模式呢?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-14 20:30:34

不能,目前还没有办法使用Spring Data R2DBC从实体中生成模式。

我在Postgres DB的一个项目中使用它,管理数据库迁移很复杂,但我在启动时设法将Flyway与同步Postgre驱动程序(Flyway还不能与反应式驱动程序一起使用)连接起来,以处理模式迁移。

即使你仍然需要编写自己的CREATE TABLE语句,这不应该那么难,你甚至可以在一些简单的项目中修改你的实体来创建JPA实体,让Hibernate创建模式,然后将其复制粘贴到你的R2DBC项目的迁移文件中。

票数 4
EN

Stack Overflow用户

发布于 2020-03-14 15:13:19

这对于测试和生产都是可能的。

请确保您的用户没有更改模式的权限,否则您可能会错误地删除表!或者使用像flyway这样的迁移工具。

您需要将schema.sql放在主资源中并添加相关属性

代码语言:javascript
复制
spring.r2dbc.initialization-mode=always

用于测试的h2和用于生产的postgres

我使用gradle,驱动程序的版本是:

代码语言:javascript
复制
    implementation 'org.springframework.boot.experimental:spring-boot-actuator-autoconfigure-r2dbc'
    runtimeOnly 'com.h2database:h2'
    runtimeOnly 'io.r2dbc:r2dbc-h2'
    runtimeOnly 'io.r2dbc:r2dbc-postgresql'
    runtimeOnly 'org.postgresql:postgresql'
    testImplementation 'org.springframework.boot.experimental:spring-boot-test-autoconfigure-r2dbc'

BOM版本为

代码语言:javascript
复制
dependencyManagement {
    imports {
        mavenBom 'org.springframework.boot.experimental:spring-boot-bom-r2dbc:0.1.0.M3'
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-09-30 00:21:34

这就是我解决这个问题的方法:

控制器:

代码语言:javascript
复制
    @PostMapping(MAP + PATH_DDL_PROC_DB)  //PATH_DDL_PROC_DB = "/database/{db}/{schema}/{table}"
    public Flux<Object> createDbByDb(
            @PathVariable("db") String db,
            @PathVariable("schema") String schema,
            @PathVariable("table") String table) {
        return ddlProcService.createDbByDb(db,schema,table);

服务:

代码语言:javascript
复制
    public Flux<Object> createDbByDb(String db,String schema,String table) {
        return ddl.createDbByDb(db,schema,table);
    }

存储库:

代码语言:javascript
复制
    @Autowired
    PostgresqlConnectionConfiguration.Builder connConfig;

    public Flux<Object> createDbByDb(String db,String schema,String table) {
        return createDb(db).thenMany(
                Mono.from(connFactory(connConfig.database(db)).create())
                    .flatMapMany(
                            connection ->
                                    Flux.from(connection
                                                      .createBatch()
                                                      .add(sqlCreateSchema(db))
                                                      .add(sqlCreateTable(db,table))
                                                      .add(sqlPopulateTable(db,table))
                                                      .execute()
                                             )));
    }

    private Mono<Void> createDb(String db) {

        PostgresqlConnectionFactory
                connectionFactory = connFactory(connConfig);

        DatabaseClient ddl = DatabaseClient.create(connectionFactory);

        return ddl
                .execute(sqlCreateDb(db))
                .then();
    }

连接类:

代码语言:javascript
复制
@Slf4j
@Configuration
@EnableR2dbcRepositories
public class Connection extends AbstractR2dbcConfiguration {

    /*
     **********************************************
     * Spring Data JDBC:
     *      DDL: does not support JPA.
     *
     * R2DBC
     *      DDL:
     *          -does no support JPA
     *          -To achieve DDL, uses R2dbc.DataBaseClient
     *
     *      DML:
     *          -it uses R2dbcREpositories
     *          -R2dbcRepositories is different than
     *          R2dbc.DataBaseClient
     * ********************************************
     */
    @Bean
    public PostgresqlConnectionConfiguration.Builder connectionConfig() {
        return PostgresqlConnectionConfiguration
                .builder()
                .host("db-r2dbc")
                .port(5432)
                .username("root")
                .password("root");
    }

    @Bean
    public PostgresqlConnectionFactory connectionFactory() {
        return
                new PostgresqlConnectionFactory(
                        connectionConfig().build()
                );
    }
}

DDL脚本:

代码语言:javascript
复制
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class DDLScripts {

    public static final String SQL_GET_TASK = "select * from tasks";

    public static String sqlCreateDb(String db) {
        String sql = "create database %1$s;";
        String[] sql1OrderedParams = quotify(new String[]{db});
        String finalSql = format(sql,(Object[]) sql1OrderedParams);
        return finalSql;
    }

    public static String sqlCreateSchema(String schema) {
        String sql = "create schema if not exists %1$s;";
        String[] sql1OrderedParams = quotify(new String[]{schema});
        return format(sql,(Object[])  sql1OrderedParams);
    }

    public static String sqlCreateTable(String schema,String table) {

        String sql1 = "create table %1$s.%2$s " +
                "(id serial not null constraint tasks_pk primary key, " +
                "lastname varchar not null); ";
        String[] sql1OrderedParams = quotify(new String[]{schema,table});
        String sql1Final = format(sql1,(Object[])  sql1OrderedParams);

        String sql2 = "alter table %1$s.%2$s owner to root; ";
        String[] sql2OrderedParams = quotify(new String[]{schema,table});
        String sql2Final = format(sql2,(Object[])  sql2OrderedParams);

        return sql1Final + sql2Final;
    }

    public static String sqlPopulateTable(String schema,String table) {

        String sql = "insert into %1$s.%2$s values (1, 'schema-table-%3$s');";
        String[] sql1OrderedParams = quotify(new String[]{schema,table,schema});
        return format(sql,(Object[]) sql1OrderedParams);
    }

    private static String[] quotify(String[] stringArray) {

        String[] returnArray = new String[stringArray.length];

        for (int i = 0; i < stringArray.length; i++) {
            returnArray[i] = "\"" + stringArray[i] + "\"";
        }
        return returnArray;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58684134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档