数据库连接器中的 Mule 4 动态查询
Mule 4 dynamic queries in the Database Connector
在 Mule 4 的流程中,我正在尝试查询数据库以获取特定数据。
例如我想 运行 这样的查询:
SELECT * FROM mulesoft WHERE plant = CCCNNB;
问题是 plant
和 CCNNB
都需要是动态的。他们将通过 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>
流程说明
- 我正在使用问题
中的负载
- 设置一个变量名“SORT_KEY”,这个变量的值是我们收到的完整有效载荷。
- 然后在 Db 连接器中创建动态查询
- 使用转换消息发送我们从数据库收到的数据作为响应
所以,这里有几个问题。一、创建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
在 Mule 4 的流程中,我正在尝试查询数据库以获取特定数据。 例如我想 运行 这样的查询:
SELECT * FROM mulesoft WHERE plant = CCCNNB;
问题是 plant
和 CCNNB
都需要是动态的。他们将通过 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>
流程说明
- 我正在使用问题 中的负载
- 设置一个变量名“SORT_KEY”,这个变量的值是我们收到的完整有效载荷。
- 然后在 Db 连接器中创建动态查询
- 使用转换消息发送我们从数据库收到的数据作为响应
所以,这里有几个问题。一、创建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