将 Postgres和 AWS Redshift数据库链接与 JOOQ 结合使用

问题描述

我们正在尝试在 Postgres 和 AWS Redshift DB 之间建立数据库链接(这不是问题),但我们正在使用 JOOQ 为其构建数据库查询

什么是有效的?如果两个表在同一个数据库中,我们可以为我们想要获取的数据编写 JOIN sql 查询。例如,如果我们有一个查询

item[0]

现在我们正在使用 JOOQ 构建查询

SELECT somefields
FROM dblink('global_database'::text,'
SELECT
    ... some data selected...) t1(username text,location int,createdAt timestamptz)
         JOIN user_Meta t2 on "userId" = t1.userId
    AND createdAt between ... some date range ...
WHERE ...'
GROUP BY ...
ORDER BY ... DESC;

如何在JOOQ Query中建立数据库链接

解决方法

分两步做:

  • 分别为您的两个数据库生成代码。使用 <outputSchemaToDefault>true</outputSchemaToDefault>,see the manual
  • 确保 Redshift 表没有与之关联的架构
  • 每当您使用 dblink 时,将 Redshift 表放在 plain SQL template 子句中,否则使用生成的类,例如使用以下实用程序:
FROM

隐含通常的静态导入:

static Table<?> dblink(String conn,Table<?> table,Field<?>... fields) {
    return table("dblink({0},{1}) as {2}({3})",inline(conn),inline(DSL.using(POSTGRES).render(select(fields).from(table))),table.getUnqualifiedName(),list(
            Stream.of(fields)
                  .map(f -> DSL.sql("{0} {1}",f.getUnqualifiedName(),sql(f.getDataType().getCastTypeName())
                  ))
                  .toArray(QueryPart[]::new)
        )
    );
}

然后像这样使用这个实用程序:

import static org.jooq.impl.DSL.*;