【问题标题】:executeSql failing after putSql processorputSql 处理器后 executeSql 失败
【发布时间】:2019-02-17 14:38:01
【问题描述】:

我的用例是为一组表查询一组数据并将其插入到一个表中。所以我的nifi处理器基本上是这样的:

executeSql(数据集的查询集)>>> convertAvrotoJson >>>> convetJSONtoSQL(转换为插入语句)>>>> putSQL(插入语句)>>> executeSQL(删除与第一个处理器查询相关的行表)

问题出在最后一个 executeSQL 处理器中,当它没有执行我的 sql 时,它一直在尝试运行 putSQL 查询。

为了测试,我只用一个普通的选择替换了我的删除查询(这是在 executeSQL 中):

这是 executeSQL 的数据来源,我们可以清楚地看到它仍在尝试执行来自 putSQL 的插入语句,即使我已经指定只执行查询:

这是错误,错误清楚地表明我没有提供参数,而我显然不希望它执行插入语句:

在表 A 中成功插入记录后,如何在表 B 上执行删除语句?请帮助,因为我坚持这一点。请不要与图像混淆,因为我只是用普通选择测试它以确保 nifi 可以正确执行我的查询。 我正在使用 mysql 5.7

【问题讨论】:

    标签: mysql apache-nifi


    【解决方案1】:

    如果流文件中有sql.args 属性,ExecuteSQL 将尝试使用它们来使用参数填充 PreparedStatement。这是因为指定的查询(无论是通过流文件正文还是SQL select query 属性传入)可以有? 参数,由流文件属性填充。对于上面的流程,您可以在 PutSQL 和 ExecuteSQL 之间放置一个 UpdateAttribute 处理器,将 Delete Attributes Expression 属性设置为 sql\.args\..* 或其他内容,以删除参数。

    话虽如此,我建议您将整个流程替换为 ExecuteSQL -> PutDatabaseRecord -> ExecuteSQL。这绕过了转换逻辑,SQL 生成/执行在内部完成(因此不需要sql.args 属性)。

    【讨论】:

    • 我删除了所有的 sql 参数,现在它可以工作了...我尝试使用 putdatabaserecord,我找不到一个好的示例来了解如何使用它...我也不了解 putdatabaserecord 的要求。 ..如果你能指出我的方向
    • PutDatabaseRecord 很像 ConvertJSONToSQL(除了输入不必是 JSON)-> PutSQL,它不使用 sql.args 属性,因为它将使用每个属性的实际值/类型传入记录。
    猜你喜欢
    • 2023-02-10
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多