jOOQ:在特定表中查找约束

时间:2019-11-15 16:08:23

标签: java jooq flyway

在进行非jOOQ迁移(不生成代码)时,我遇到一种情况,我需要检查数据库中是否已经存在约束(唯一,外键)以完成进一步的操作。

到目前为止,我一直在尝试运行drop并尝试捕获异常,但是它使事务失败并停止了后续迁移

dsl.alterTable(table).dropConstraint(constraintName).execute();
...
>>  ERROR: constraint "t_client_name_unique" of relation "t_client" does not exist

设置:

  • 春天
  • 没有代码生成的jOOQ
  • FlywayDB作为迁移库
  • Postgres

1 个答案:

答案 0 :(得分:1)

未来的解决方案(在jOOQ 3.12中不可用)

对于jOOQ 3.13+,我们正在大力投资以支持更多此类迁移方案。将来,我们将支持一些与供应商无关的information_schema样式视图,这些视图可为所有数据库生成这种元信息:#8301

本机DROP CONSTRAINT IF EXISTS支持#9557是另一项可以立即为您提供帮助的功能。当然,您可以使用plain SQL在PostgreSQL上运行此特定语句,直到#9557可用为止

现在的解决方案

或者,由于您仅使用PostgreSQL,因此可以直接通过查询PostgreSQL的information_schema来执行此操作。您可以生成information_schema表,然后运行以下查询:

select *
from information_schema.table_constraints
where constraint_schema = :constraint_schema
and constraint_name = :constraint_name