如何添加分号;使用 jOOQ 自动生成每个生成的 sql 语句

时间:2021-04-05 20:38:19

标签: sql jooq

我正在尝试为每个 jOOQ 生成的 sql 语句添加一个分号 ;,因为我正在将多个 DDL 和 insert 语句写入输出文件。

我在这里发现了一个类似的问题,建议在此处使用 ExecuteListener https://jooq-user.narkive.com/6adKecpt/adding-semicolon-at-the-end-of-sql-statement

我的设置现在如下(使用 Groovy):

    private DSLContext createDSLContext() {
        def configuration = new DefaultConfiguration()
        configuration.settings = new Settings()
                .withRenderFormatted(true)
                .withRenderKeywordCase(RenderKeywordCase.LOWER)
                .withRenderQuotedNames(RenderQuotedNames.ALWAYS)
                .withStatementType(StatementType.STATIC_STATEMENT)
        configuration.set(
                new DefaultExecuteListenerProvider(new DefaultExecuteListener() {
                    @Override
                    void renderEnd(ExecuteContext ctx) {
                        ctx.sql(ctx.sql() + ";")
                    }
                }),
                new DefaultExecuteListenerProvider(new DefaultExecuteListener() {
                    @Override
                    void start(ExecuteContext ctx) {
                        println "YEAH!!!"
                    }
                }))
        // return configuration.dsl();
        return DSL.using(configuration)
    }

但没有添加分号,也根本没有进入 renderEnd 方法。 我添加了另一个执行侦听器以在开始时打印一些内容(正如我在其他示例中看到的那样),但它也从未被调用过..

我的代码如下:

        file.withWriter { writer ->

            // Drop schema objects.

            DEFAULT_SCHEMA.tables.each {
                switch (it.type) {
                    case TABLE:
                        writer.writeLine(dsl.dropTableIfExists(it).SQL)
                        break
                    case VIEW:
                        writer.writeLine(dsl.dropViewIfExists(it).SQL)
                        break
                }
            }
            writer.writeLine("")

            // Create schema objects.

            def ddlStatements = dsl.ddl(DEFAULT_SCHEMA)
            ddlStatements.each {
                writer.writeLine(it.SQL)
                writer.writeLine("")
            }

            // Insert data.

            def insert = dsl.insertInto(Tales.CUSTOMER).columns(Tales.CUSTOMER.fields())
            customers.each {insert.values(it) }
            writer.writeLine(insert.SQL)

        }

1 个答案:

答案 0 :(得分:0)

df = pd.DataFrame({'is_bool':['', True, False, np.nan, 'foo', 3]}) def check_bool(x): return isinstance(x, bool) print (df['is_bool'].apply(check_bool)) 0 False 1 True 2 True 3 False 4 False 5 False Name: is_bool, dtype: bool 生命周期仅在您使用 jOOQ执行查询时触发。你没有这样做,你只是在调用 Query.getSQL()

您可以将您的查询包装到 DSLContext.queries(Query...) 中,当您调用 ExecuteListener 时,jOOQ 将使用 ; 分隔语句。当然,这并不可靠,Queries.getSQL() 的行为在未来可能会发生变化,这就是为什么提供 Queries.toString() 之类的方法是有意义的:https://github.com/jOOQ/jOOQ/issues/11755

就目前而言,为什么不手动将分号添加到代码中的 toString() 中?