当前位置: 首页 > 知识库问答 >
问题:

如何在Jooq代码生成中使用Liquibase上下文

华涵意
2023-03-14

我有一个Springboot项目,它使用Liquibase进行数据库迁移,使用Jooq进行数据库访问和相关的代码生成。当Jooq反省一个应用了所有更改的数据库时,这很好,但是现在我想转换到内存中的H2数据库来生成代码,这样Jooq就不依赖于我的实际(Postgres)数据库。

但是当使用Jooq生成源时,我现在得到一个错误,因为我有一个唯一约束的列上有一个重复的键异常。我注意到这是因为我使用Liquibase上下文以便在测试、开发和生产环境中插入不同的数据。Jooq似乎忽略了这些上下文,并将所有更改应用于同一个数据库,当我在测试和开发中插入相同的数据时,生成失败。那么,我如何确保Jooq和Liquibase在生成源阶段已经使用了正确的上下文(和maven配置文件)?

我的设置中的一些摘录:

波姆。xml

        <profile>
            <id>local</id>
            <properties>
                <activatedProperties>local</activatedProperties>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>

...

            <plugin>
                <groupId>org.jooq</groupId>
                <artifactId>jooq-codegen-maven</artifactId>
                <version>${jooq.version}</version>

                <!-- The plugin should hook into the generate goal -->
                <executions>
                    <execution>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>

                <!-- Specify the plugin configuration.
                     The configuration format is the same as for the standalone code generator -->
                <configuration>
                <generator>
                    <database>
                        <name>org.jooq.meta.extensions.liquibase.LiquibaseDatabase</name>
                        <properties>
                            <property>
                                <key>sort</key>
                                <value>liquibase</value>
                            </property>
                            <property>
                                <key>scripts</key>
                                <value>src/main/resources/liquibase/changelog-master.xml</value>
                            </property>
                            <property>
                                <key>unqualifiedSchema</key>
                                <value>none</value>
                            </property>
                            <property>
                                <key>defaultNameCase</key>
                                <value>lower</value>
                            </property>
                        </properties>
                    </database>
                    <target>
                        <packageName>com.graphite.horses</packageName>
                        <directory>target/generated-sources/jooq</directory>
                    </target>
                    <generate>
                        <javaTimeTypes>true</javaTimeTypes>
                    </generate>
                </generator>
                </configuration>
            </plugin

液化更改文件:

    <changeSet id="addInitialCredentialsValuesLocal" author="daniel" context="local">
        <insert tableName="credentials">
            <column name="key" value="my-token"/>
            <column name="platform" value="web"/>
        </insert>
    </changeSet>

    <changeSet id="addInitialCredentialsValuesTest" author="daniel" context="test">
        <insert tableName="credentials">
            <column name="key" value="my-token"/>
            <column name="platform" value="web"/>
        </insert>
    </changeSet>

这就是它失败的地方,因为“我的令牌”被再次插入到Jooq的内存数据库中,即使测试上下文不应该是活动的。

共有1个答案

凤扬
2023-03-14

从jOOQ 3.14.0和3.13.2(参见#9872)开始,“contexts”参数可以传递给Liquibase数据实例,如下所示:

<!-- The property "changeLogParameters.contexts" will be passed on to the 
     liquibase.database.Database.update() call (jOOQ 3.13.2+).
     See https://www.liquibase.org/documentation/contexts.html -->
<property>
  <key>changeLogParameters.contexts</key>
  <value>!test</value>
</property>

请参阅此处的示例配置:https://www.jooq.org/doc/latest/manual/code-generation/codegen-liquibase/

 类似资料:
  • 我更改了数据库中的一些表,所以我想生成记录、键、类等。但是每次我这样做时,它总是跳过jooq代码生成。 [INFO]--jooq-codegen-maven:3.11.10:generate(默认cli)@http网关--[INFO]跳过jooq代码生成 为了运行Jooq代码生成,我应该执行哪个mvn cmd?现在我使用: 谢谢

  • 我一直在尝试使用插入。。。在MySQL中返回基于DSL的表定义(我没有使用代码生成),返回的记录总是空的。基于阅读,我需要在表定义中指定标识列,但我不知道如何指定! 字段“id”是数据库中的自动增量主键,但recordKey始终为空。

  • 我使用jOOQ程序代码生成数据库,但现在我遇到了一些问题。在数据库中,我有表A和表B。第一次都生成了pojo、dao、接口等。经过一段时间的开发,我发现表A需要添加一些字段或修改一些字段,所以我不得不再次编码,然后jOOQ代码生成器将覆盖现有的代码,这让我很难过。当我在排除表的情况下使用“排除A”时,发现只生成了表A的数据,表B将被删除。我不知道如何处理这个问题。我的代码生成器如下:

  • 是否有任何参数可以在jooq代码生成期间打开/关闭下一个查询的执行? 在有大量模式和对象的数据库上,执行大约需要一个小时

  • 我目前正在评估Jooq。我们在创建join语句时遇到了一些问题,如下所示: 但这并不奏效。我仍然有以为类型的字段。那么除了更改表列类型之外,我还能做些什么呢?

  • 这类似于这个问题,但我们用Gradle代替。假设我们在构建脚本中直接使用jOOQ的代码生成,正如文档中所描述的那样。 有两个问题。首先,我们将向生成器配置中添加一个新的策略,这应该很简单: 然而,如果我们打印得到的XML配置,名称元素就会被神秘地省略(也会被悄悄地省略): 其次,可以使用什么机制来预编译生成器策略类()并使其在构建脚本的类路径中可用?这里有一个可能的问题:策略代码依赖于jOOQ的c