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

如何对尚不存在的表使用Jooq?

单于浩邈
2023-03-14

我有一个数据库(postgresql)与表Cdr。每个月都会在数据库中创建一个新表,该表具有与Table Cdr相同的模式,名为Cdr__(例如。Cdr_2016_04)。

我试图使用Jooq查询数据库,基于提供的日期。麻烦的是:

context.select(CDR.fields())
            .from("cdr_2017_01")
            .where(CDR.FIELD1.eq("somevalue")
                .and(CDR.FIELD2.notEqual("value 2")
                .and(CDR.FIELD2.notEqual("value 3")))
            .fetchInto(Cdr.class);

不起作用,因为它表明

组织。约克。例外DataAccessException:。。。来自cdr_2017_01,其中“公共”、“cdr”、“field1”和“公共”、“cdr”、“field2”

我尝试使用别名将其cdr_2017_01为cdr,但失败了,因为cdr已经存在。因为我使用CDR. FIELD1和CDR. field(),jooq要求from子句中的表是CDR。是否有某种方法可以使其通用,或者我不应该使用Jooq进行这种查询?

共有1个答案

谭梓
2023-03-14

您得到的错误源于您在字段引用中使用生成的CDRliteral,例如CDR。字段1。所有这些字段都将使用“cdr”表完全限定,而不是您在from子句中输入的“cdr\u 2017\u 01”表。

您可以打开调试日志以查看jOOQ生成并发送到服务器的格式化SQL字符串。

最简单的解决方法是将您的"cdr_2017_01"表重新命名为"cdr",如下所示:

context.select(CDR.fields())
        .from("cdr_2017_01 as cdr")
        .where(CDR.FIELD1.eq("somevalue")
            .and(CDR.FIELD2.notEqual("value 2")
            .and(CDR.FIELD2.notEqual("value 3")))
        .fetchInto(Cdr.class);

这在某种程度上适用于大多数查询。

您应该为此使用运行时架构/表映射功能。它正是为这些类型的多租户/分区用例而设计的。

然后,你可以这样写:

DSL.using(connection, new Settings()
       .withRenderMapping(new RenderMapping()
           .withSchemata(new MappedSchema()
               .withInput("my_schema_name")
               .withTables(new MappedTable()
                   .withInput(CDR.getName())
                   .withOutput(CDR.getName() + "_2017_01")))))
   .select(CDR.fields())
   .from(CDR)
   .where(CDR.FIELD1.eq("somevalue")
       .and(CDR.FIELD2.notEqual("value 2")
       .and(CDR.FIELD2.notEqual("value 3")))
   .fetchInto(Cdr.class);

当然,另一种选择可能是使用PostgreSQL的分区功能,在这种情况下,您可能不需要在客户机中显式指定表名:

https://www.postgresql.org/docs/current/static/ddl-partitioning.html

 类似资料:
  • 问题内容: 我正在尝试创建表(如果尚不存在)。我目前正在检查它是否首先存在,并且该查询是否不返回任何内容,然后插入。有没有一种方法可以只检查同一条语句,因此我不必将其分解为单独的查询? 这就是我目前所拥有的。 这是我要的东西。 问题是,您不能在语句中添加一个。 问题答案: 是的,Oracle没有该功能真是可惜。我敢肯定会有一天。在此之前,如果您想编写一个PL / SQL包装器,为什么不那样做:

  • 问题内容: 如何保证我可以搜索数据库中是否存在用户名,然后将该用户名作为新行插入数据库中,而and 语句之间没有任何截距? 几乎就像我锁在不存在的行上。我想用用户名 “ Foo” 锁定不存在的行,以便现在可以检查数据库中是否存在该行,并将其插入数据库(如果尚不存在的话)将其插入数据库。 我知道使用和存在,但据我所知,仅适用于已经存在的行。我不确定在这种情况下该怎么办。 问题答案: 如果存在索引(应

  • 如何保证我可以搜索我的数据库中是否存在用户名,然后将该用户名作为新行插入数据库,而不会在和语句之间进行任何拦截? 几乎就像我锁定了一个不存在的行。我想用用户名“Foo”锁定不存在的行,这样我现在可以检查它是否存在于数据库中,如果它还不存在,就可以将它插入数据库中,而不会出现任何中断。 我知道使用< code>LOCK IN SHARE MODE和< code>FOR UPDATE是存在的,但是据我

  • 问题内容: 我想检查是否存在存储过程列表。我希望所有这些都在1个脚本中一个接一个地完成。到目前为止,我有这种格式: 等等。但是,出现以下错误: 关键字“过程”附近的语法不正确。 为什么我的工作不正常? 问题答案: 必须是批处理中的第一个语句。我通常会这样: (不要忘记授予声明,因为如果您重新创建proc,它们将会丢失) 部署存储过程时要考虑的另一件事是,删除可以成功而创建失败。出现问题时,我总是使

  • 问题内容: Postgres是否有任何办法说如果约束已经存在,它将忽略该命令,从而不会引发错误? 问题答案: 这可能有所帮助,尽管可能有点脏: 然后致电: 更新: 根据Webmut的以下建议: 在您的开发数据库中,或者在您知道可以关闭依赖该数据库的应用程序作为维护时段的情况下,这可能很好。 但是,如果这是一个至关重要的24x7全天候生产环境,那么您真的不想像这样随意地放弃约束。即使是几毫秒,也有一

  • 问题内容: 在使用Bluehost进行WordPress安装时,我遇到了一些情况,由于没有上传文件夹,我的WordPress主题遇到了错误。 显然,尽管HostGator可以,Bluehost cPanel WordPress安装程序不会创建此文件夹。 因此,我需要向主题添加代码,以检查文件夹并以其他方式创建该文件夹。 问题答案: 尝试这个: 请注意,这已经是目录的默认模式,并且仍可以被当前的um