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

jOOQ使用一个数据库生成代码,另一个数据库执行代码

韩英锐
2023-03-14

我们正在改变数据库,从一个支持8位int的数据库到一个不支持8位int的数据库。当Liquibase创建一个DB导致jOOQ生成“短”变量时,我们的代码会中断,但我们的代码使用字节/字节-这会中断代码签名。

有人建议我们继续使用以前的数据库(HSQLDB)来生成代码,而不是重新编码,它“应该”与新数据库一起运行。有不同的意见,除了直觉,我找不到任何决定性的东西,这似乎与jOOQ的设计目的背道而驰。有人成功地做到了吗?

共有1个答案

司徒啸
2023-03-14

对于这样一个问题,显然没有绝对肯定/否定的答案,但有几种解决方案/变通办法:

这将在短时间内起作用,例如现在,但随着您的继续,它将成为模式设计的一个极其有限的因素。您将继续围绕HSQLDB的功能定制DDL和其他一些设计决策,而您将无法利用新数据库产品的其他功能。在迁移数据时,这可能特别有限,因为不同方言的altertable语句非常不同。

我建议这种方法只在很短的时间内使用,例如,如果您不能立即彻底解决此问题。

jOOQ的代码生成器允许在将模式的元数据加载到代码生成器之前重写数据类型。这样,即使新数据库产品不支持TINYINT,您也可以在新数据库产品上假装您的byte类型是TINYINT

这是一个全面的解决方案,无论您使用的是什么产品,您都可能想要实现它,因为它将为您提供一种重新定义架构部分的方法,仅用于jOOQ的代码生成器,而不管您如何生成代码。

此处记录了该功能:https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-forced-types

这对你的情况来说绝对是一个更长期的解决方案。

注意,未来的jOOQ将能够使用CHECK约束作为输入元数据来决定是否应用这样的

在该功能可用之前,您可以通过编程代码生成器配置自行实现该功能:https://www.jooq.org/doc/latest/manual/code-generation/codegen-programmatic/

或者,从jOOQ 3.12开始,使用SQL表达式生成

<forcedType>
  <name>TINYINT</name>
  <sql>
    select listagg(owner || '.' || table_name || '.' 
      || regexp_replace(search_condition_vc, ' between.*', ''), '|')
    from user_constraints
    where constraint_type = 'C'
    and regexp_like(search_condition_vc, '.* between -128 and 127');
  </sql>
</forcedType>

jOOQ无需连接到实时数据库实例即可对模式进行反向工程。您还可以将DDL代码传递给jOOQ或XML文件:

  • https://www.jooq.org/doc/latest/manual/code-generation/codegen-ddl/
  • https://www.jooq.org/doc/latest/manual/code-generation/codegen-xml/

这并不是直接解决你的问题,但也许,这会让解决问题变得更容易一些。但是,这些方法还有其他限制,例如,存储过程目前(jOOQ 3.12)不受支持,所以我只是为了完整起见在这里添加它,而不是建议您现在就使用它。

 类似资料:
  • 问题内容: 我需要将数据从一个数据库迁移到另一个数据库,两者都在同一本地系统上。 表和列的名称不同,我不能从旧数据库迁移所有列,因此 对我不起作用。 但我只有一个 我的查询中有什么错误,我该如何解决? 提前致谢 问题答案: 您的查询应如下所示: 更新 由于这个答案的关注程度超出了我的预期,因此我应该扩展这个答案。首先,从答案本身看可能并不明显,但各列不必具有相同的名称。因此,以下操作也将起作用(假

  • 问题内容: 如何从一个数据库复制到另一个数据库。 数据库名称visco 我想将所有表从visco数据库复制到新数据库名称作为neptune 我创建了一个没有任何表的数据库,然后尝试从database1.bak文件还原数据库,然后显示错误为 需要查询帮助 问题答案: 使用SQL Server Management Studio: 选项1 ->右键单击要复制的数据库 ->选择“任务”>“生成脚本” -

  • 问题内容: 我需要将数据从一个表复制到另一个表。这两个表几乎具有相同的结构,但是位于不同的数据库中。 我试过了 我尝试此操作,但跨数据库出现错误…未实现 问题答案: 这是一个非常简单的任务。只需为此目的使用dblink: 如果您需要定期从外部数据库中获取数据,明智的做法是定义服务器和用户映射。然后,您可以使用较短的语句:

  • 问题内容: 我有两个数据库,一个叫做,一个叫做。由于我想练习插入,更新内容,因此我想将某些表从复制到。 我要复制的表称为: 我试图做的是(使用SSMS)右键单击表格,但其中没有“复制”! 问题答案: 假设您有两个数据库,例如A和B: 如果目标表不存在,将创建以下脚本(我不建议这样): INTO COPY_TABLE_HERE FROM A.dbo.table_from_A table_A 如果目标

  • 为了方便一部分人还是做了一个代码生成器的,但我本人不喜欢用代码生成器,除非项目比较庞大的时候。 代码生成器的代码在 codegen 这里,它是一个maven工程, 你只需要下载下来修改一下配置就可以了: public static void main(String[] args) throws IOException { DBMeta dbMeta = new DBMeta()

  • 我正在用我的应用程序测试PostgreSQL和CockroachDB。我可以用PostgreSQL或CockroachDB运行我的应用程序。是否可以设置Flyway,使我可以使用Flyway支持运行,而不会因为为我目前不使用的另一个数据库配置Flyway而出现错误? 我试图寻找回答这个问题的留档,但似乎这方面的大多数留档都涉及同时运行两个数据库,这不是我在这里试图做的。 没什么大不了的,但我很好奇