数据库连接器中的 Mule 4 动态查询

Mule 4 dynamic queries in the Database Connector

在 Mule 4 的流程中,我正在尝试查询数据库以获取特定数据。 例如我想 运行 这样的查询:

SELECT * FROM mulesoft WHERE plant = CCCNNB;

问题是 plantCCNNB 都需要是动态的。他们将通过 API 请求。我可以处理动态值,但每当我尝试使字段动态化时,我得到的结果都是空的。 我首先创建一个变量来存储请求中的 json:

set-variable value="#[payload]" doc:name="Set Variable" doc:id="8ed26865-d722-4fdb-9407-1f629b45d318" variableName="SORT_KEY"/>

请求看起来像这样:

{
 "FILTER_KEY": "plant",
 "FILTER_VALS": "CCNNB"
}

之后在数据库连接器中我配置如下:

<db:select doc:name="Select" doc:id="13a66f51-2a4e-4949-b383-86c43056f7a3" config-ref="Database_Config">
        <db:sql><![CDATA[SELECT * FROM mulesoft WHERE :filter_key = :filter_val;]]></db:sql>
        <db:input-parameters ><![CDATA[#[{
        "filter_val": vars.SORT_KEY.FILTER_VALS,
        "filter_key": vars.SORT_KEY.FILTER_KEY
    }]]]></db:input-parameters>

plant 替换 :filter_key 是可行的,但是当我尝试使其动态时,我在响应中什么也得不到。它并没有失败,响应代码是 200,但我在里面什么也没有。 我怎样才能使这项工作?

您可以直接在查询本身中使用存储的变量。

查询应该是DataWeave中的表达式。

#["SELECT * FROM $(vars.table) WHERE $(vars.SORT_KEY.FILTER_KEY) = :filter_val"]
<db:select config-ref="Database_Config">
  <db:sql><![CDATA[#["SELECT * FROM $(vars.table) WHERE $(vars.SORT_KEY.FILTER_KEY) = :filter_val"]]]></db:sql>
    <db:input-parameters ><![CDATA[#[{
                                 "filter_val": vars.SORT_KEY.FILTER_VALS
                          }]]]>
    </db:input-parameters>          
</db:select>

还有另一种方法也可以从有效负载中读取值以构建动态查询,如下所示

#["SELECT * FROM mulesoft 
         WHERE " ++ vars.SORT_KEY.FILTER_KEY ++ " = '" ++ vars.SORT_KEY.FILTER_VALS ++ "'"]

下面是为此创建的 XML,作为 POC

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:os="http://www.mulesoft.org/schema/mule/os"
    xmlns:salesforce="http://www.mulesoft.org/schema/mule/salesforce"
    xmlns:db="http://www.mulesoft.org/schema/mule/db"
    xmlns:xml-module="http://www.mulesoft.org/schema/mule/xml-module"
    xmlns:http="http://www.mulesoft.org/schema/mule/http"
    xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core"
    xmlns="http://www.mulesoft.org/schema/mule/core"
    xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd
http://www.mulesoft.org/schema/mule/os http://www.mulesoft.org/schema/mule/os/current/mule-os.xsd">

    <http:listener-config name="HTTP_Listener_config1"
        doc:name="HTTP Listener config"
        doc:id="6d5de64b-1355-4967-9352-4b324f02c7ad">
        <http:listener-connection host="0.0.0.0"
            port="8081" />
    </http:listener-config>

    <db:config name="Database_Config" doc:name="Database Config"
        doc:id="d5c4d49c-aef3-4d4a-a7b5-470da3354127">
        <db:my-sql-connection host="localhost"
            port="3306" user="root" password="admin123" database="Mysql" />
    </db:config>
    <flow name="testFlow"
        doc:id="8cfea1b0-d244-40d9-989c-e136af0d9f80" initialState="started">
        <http:listener doc:name="Listener"
            doc:id="265e671b-7d2f-4f3a-908c-8065a5f36a07"
            config-ref="HTTP_Listener_config1" path="test" />
        <set-variable value="#[payload]" doc:name="Set Variable"
            doc:id="265a16c5-68d4-4217-8626-c4ab0a3e38e5" variableName="SORT_KEY" />
        <db:select doc:name="Select"
            doc:id="bdf4a59c-0bcc-46ac-8258-f1f1762c4e7f"
            config-ref="Database_Config">
            <db:sql><![CDATA[#["SELECT * FROM mulesoft.mulesoft WHERE " ++ vars.SORT_KEY.FILTER_KEY ++ " = '" ++ vars.SORT_KEY.FILTER_VALS ++ "'"]]]></db:sql>
        </db:select>
        <ee:transform doc:name="Transform Message"
            doc:id="72cbe69f-c52e-4df9-ba5b-dd751990bc08">
            <ee:message>
                <ee:set-payload><![CDATA[%dw 2.0
output application/json
---
payload]]></ee:set-payload>
            </ee:message>
        </ee:transform>
    </flow>
</mule>

流程说明

  1. 我正在使用问题
  2. 中的负载
  3. 设置一个变量名“SORT_KEY”,这个变量的值是我们收到的完整有效载荷。
  4. 然后在 Db 连接器中创建动态查询
  5. 使用转换消息发送我们从数据库收到的数据作为响应

所以,这里有几个问题。一、创建sql语句。 如果需要,您可以在 DB:SELECT 组件内执行 DW,如前面的答案所示。

#["SELECT * FROM myTable" ++ vars.myWhere]

#["SELECT * FROM myTable $(vars.myWhere)"]

工作。

您将 运行 遇到的问题是 DataSense 不喜欢这样。如果没有列名的文字文本,DataSense 无法确定要检索的列,因此会引发错误“无法解析参数的值:sql”。这会在您的代码中留下一个错误,这总是让我感到焦虑。我希望 Mulesoft 能解决这个问题。

顺便说一句,如果您执行动态 SQL,您仍应为每个值使用输入参数以避免 SQL 注入。

我在这里发布了一个“想法”来修复虚假错误:https://help.mulesoft.com/s/ideas#0872T000000XbjkQAC