我们有一个构建,我们使用 Liquibase 生成具有单个模式的 PostgreSQL 数据库。我们使用 jOOQ 从该数据库生成 Java 源代码。构建使用 Maven 和
jooq-codegen-maven
插件。
在构建输出中,会出现以下消息:
[INFO] No modified files : This code generation run has not produced any file modifications.
This means, the schema has not changed, and no other parameters (jOOQ version, driver version, database version,
and any configuration elements) have changed either.
In automated builds, it is recommended to prevent unnecessary code generation runs. This run took: 555.526ms
Possible means to prevent this:
- Use manual code generation and check in generated sources: https://www.jooq.org/doc/latest/manual/code-generation/codegen-version-control/
- Use schema version providers: https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-version-providers/
- Use gradle tasks and inputs: https://docs.gradle.org/current/userguide/incremental_build.html
阅读了第二点中链接的说明后,我现在正在尝试弄清楚如何配置版本提供程序。
我该怎么做?
我需要
catalogVersionProvider
吗?我假设“目录”一词指的是我的数据库,我不直接对其进行版本控制。
什么是一个好的 SELECT 来用作
schemaVersionProvider
? Liquibase 似乎并没有真正的增量版本概念 - 最近应用的变更集 ID 是否有意义:
select id from databasechangelog order by dateexecuted desc limit 1;
?或者像
deployment_id
甚至 dateexecuted
这样的东西会更合适吗?
首先,如果您要为每个构建节省 0.5 秒,那么为此设置而付出的额外努力可能并不值得。但随着您的应用程序的增长,未来可能需要更长的时间......
我需要catalogVersionProvider吗?我假设“目录”一词指的是我的数据库,我不直接对其进行版本控制。
目录通常是数据库,模式是数据库内部的模式。只有少数 RDBMS 同时支持目录和模式(例如 SQL Server),因此通常情况下,您只会对模式进行版本控制,尤其是在 PostgreSQL 中。
或者像deployment_id甚至dateexecuted这样的东西会更合适吗?
从jOOQ的角度来看,“版本”方案并不重要。 jOOQ 仅检查连续重新执行之间是否发生更改。一旦您对生成的模式进行版本控制,jOOQ 将在您的目录或模式上生成
@Generated
注释,并将版本提供程序的内容与生成的代码中的现有注释进行比较。如果版本不同,则重新生成代码。如果相同,则中止重新生成。这可以节省大量针对 INFORMATION_SCHEMA
(或特定于供应商的替代方案)的查询。
但是根据 Liquibase 文档,最新的变更集 ID 可能是此处使用的版本的最佳描述符,因此您建议的 SQL 查询似乎是合理的。
还可以使用 Liquibase 的 API 设置包含迁移脚本中的 ID 的 Maven 属性,因此您甚至无需连接到实际数据库即可查找最新 ID。