如何在 mule 数据库连接器中插入多行?
how to insert multiple rows in mule database connector?
我想一次在 mule 数据库连接器中插入多行。谁能帮我解决这个问题?
我可以成功地将以下消息作为 post 请求插入 mule 流。
{
"patient_todo_id" : "2",
"comment_date" : "2017-09-20 14:41:16",
"comment_text" : "send me the steps to check the Pulse rate"
}
如何将以下 post 消息插入 mule 流中的数据库?
[{
"patient_todo_id" : "2",
"comment_date" : "2017-09-20 14:41:16",
"comment_text" : "send me the steps to check the Pulse rate"
},
{
"patient_todo_id" : "2",
"comment_date" : "2017-09-20 14:41:16",
"comment_text" : "send me the steps to check the Pulse rate"
}]
请找到下面的 mule 流配置文件,该文件已配置为一次插入一行。
<flow name="carrotcube-patient-todo-commentFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="${http.path.mrs.todo.comment}" doc:name="HTTP"/>
<set-variable variableName="variable" value="#[payload]" mimeType="application/json" doc:name="Variable"/>
<json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
<logger message="#[payload.comment_text]" level="INFO" doc:name="Logger"/>
<db:insert config-ref="MySQL_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])]]></db:parameterized-query>
</db:insert>
</flow>
Ashok,我刚刚跨过这个障碍,所以你在这里真的很幸运,因为我不得不挣扎了一段时间。非常令人惊讶的是,在互联网上找不到这样一个常见的场景。步骤如下,流程如下。
1) 使用 transform 将 post payload 转换为 java 列表 (application/java) – 输出应该只有 payload(去掉花括号,只放 payload)。这个payload应该来自body。
2) 用于每个范围并将数据库插入语句放在那里
3) 在数据库插入语句中使用[payload['username']] 种语法来引用当前记录中用户名的值(或您拥有的任何字段名称)。我正在使用存储产品插入,但你明白了。
我无法post这里的流程..它正在切断它并显示它很奇怪。如果你可以分享,我会尝试通过电子邮件发送给你。
现在我要弄清楚的是如何发送一条包含插入状态的好消息。任何已经这样做的人..感谢您的投入!
这非常简单,您可以通过两种方式完成:
解决方案 1 使用拆分器:
<flow name="testFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/>
<json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
<collection-splitter doc:name="Collection Splitter"/>
<logger message="insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])" level="INFO" doc:name="Logger"/>
<collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/>
<json:object-to-json-transformer doc:name="Object to JSON"/>
</flow>
解决方案 2 使用 foreach:
<flow name="testFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/>
<json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
<foreach doc:name="For Each" collection="#[payload]">
<logger message="insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])" level="INFO" doc:name="Logger"/>
</foreach>
<json:object-to-json-transformer doc:name="Object to JSON"/>
</flow>
在这两种情况下,您都可以看到您的记录器在您使用的 SQL 语句中获取正确的值:
<logger message="insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])" level="INFO" doc:name="Logger"/>
现在您可以用 DB 组件替换记录器
更新 基于评论:
<set-variable variableName="myMap" value="#[new java.util.HashMap()]" doc:name="Variable"/>
<foreach doc:name="For Each" collection="#[payload]">
<db:insert config-ref="MySQL_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])]]></db:parameterized-query>
</db:insert>
<expression-component doc:name="Expression"><![CDATA[flowVars.myMap.put('row'+flowVars.counter,payload)]]></expression-component>
</foreach>
<logger message="Final status #[flowVars.myMap.toString()]" level="INFO" doc:name="Logger"/>
最后,您将在记录器中获得插入的每一行的状态,1 表示成功
要在 foreach 之外获取特定行的详细信息:
<logger message="#[flowVars.myMap.get('row1').toString()]" level="INFO" doc:name="Logger"/>
因此,您可以根据状态进一步显示您的自定义状态消息
使用批量更新模式并将要插入的对象集合传递给连接器。在 Studio 中,只需选中数据库连接器的 基本设置 部分中的 "Bulk mode"。您在问题中提供的示例数组很好,然后您可以执行以下操作:
<db:insert config-ref="MySQL_Configuration" bulkMode="true" doc:name="Database">
<db:parameterized-query><![CDATA[
INSERT INTO mytable(id, name)
VALUES (#[payload.id], #[payload.name]);]]>
</db:parameterized-query>
</db:insert>
列表中的每个元素将成为连接器中的 payload
并被插入。您不需要使用 for-each 或任何循环机制。确保传递一个可迭代对象。
Ashok,在此处回复您关于汇总每个人的回复的评论,因为我还不能添加评论。查看以下 link,其中提供了一些选项。
https://forums.mulesoft.com/questions/60273/save-of-for-each-database-query-response-to-a-new.html
我想一次在 mule 数据库连接器中插入多行。谁能帮我解决这个问题?
我可以成功地将以下消息作为 post 请求插入 mule 流。
{
"patient_todo_id" : "2",
"comment_date" : "2017-09-20 14:41:16",
"comment_text" : "send me the steps to check the Pulse rate"
}
如何将以下 post 消息插入 mule 流中的数据库?
[{
"patient_todo_id" : "2",
"comment_date" : "2017-09-20 14:41:16",
"comment_text" : "send me the steps to check the Pulse rate"
},
{
"patient_todo_id" : "2",
"comment_date" : "2017-09-20 14:41:16",
"comment_text" : "send me the steps to check the Pulse rate"
}]
请找到下面的 mule 流配置文件,该文件已配置为一次插入一行。
<flow name="carrotcube-patient-todo-commentFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="${http.path.mrs.todo.comment}" doc:name="HTTP"/>
<set-variable variableName="variable" value="#[payload]" mimeType="application/json" doc:name="Variable"/>
<json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
<logger message="#[payload.comment_text]" level="INFO" doc:name="Logger"/>
<db:insert config-ref="MySQL_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])]]></db:parameterized-query>
</db:insert>
</flow>
Ashok,我刚刚跨过这个障碍,所以你在这里真的很幸运,因为我不得不挣扎了一段时间。非常令人惊讶的是,在互联网上找不到这样一个常见的场景。步骤如下,流程如下。
1) 使用 transform 将 post payload 转换为 java 列表 (application/java) – 输出应该只有 payload(去掉花括号,只放 payload)。这个payload应该来自body。
2) 用于每个范围并将数据库插入语句放在那里
3) 在数据库插入语句中使用[payload['username']] 种语法来引用当前记录中用户名的值(或您拥有的任何字段名称)。我正在使用存储产品插入,但你明白了。
我无法post这里的流程..它正在切断它并显示它很奇怪。如果你可以分享,我会尝试通过电子邮件发送给你。
现在我要弄清楚的是如何发送一条包含插入状态的好消息。任何已经这样做的人..感谢您的投入!
这非常简单,您可以通过两种方式完成:
解决方案 1 使用拆分器:
<flow name="testFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/>
<json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
<collection-splitter doc:name="Collection Splitter"/>
<logger message="insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])" level="INFO" doc:name="Logger"/>
<collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/>
<json:object-to-json-transformer doc:name="Object to JSON"/>
</flow>
解决方案 2 使用 foreach:
<flow name="testFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/>
<json:json-to-object-transformer returnClass="java.lang.Object" doc:name="JSON to Object"/>
<foreach doc:name="For Each" collection="#[payload]">
<logger message="insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])" level="INFO" doc:name="Logger"/>
</foreach>
<json:object-to-json-transformer doc:name="Object to JSON"/>
</flow>
在这两种情况下,您都可以看到您的记录器在您使用的 SQL 语句中获取正确的值:
<logger message="insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])" level="INFO" doc:name="Logger"/>
现在您可以用 DB 组件替换记录器
更新 基于评论:
<set-variable variableName="myMap" value="#[new java.util.HashMap()]" doc:name="Variable"/>
<foreach doc:name="For Each" collection="#[payload]">
<db:insert config-ref="MySQL_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into patient_todo_detail(patient_todo_id,comment_date,comment_text) values (#[payload.patient_todo_id],#[payload.comment_date],#[payload.comment_text])]]></db:parameterized-query>
</db:insert>
<expression-component doc:name="Expression"><![CDATA[flowVars.myMap.put('row'+flowVars.counter,payload)]]></expression-component>
</foreach>
<logger message="Final status #[flowVars.myMap.toString()]" level="INFO" doc:name="Logger"/>
最后,您将在记录器中获得插入的每一行的状态,1 表示成功
要在 foreach 之外获取特定行的详细信息:
<logger message="#[flowVars.myMap.get('row1').toString()]" level="INFO" doc:name="Logger"/>
因此,您可以根据状态进一步显示您的自定义状态消息
使用批量更新模式并将要插入的对象集合传递给连接器。在 Studio 中,只需选中数据库连接器的 基本设置 部分中的 "Bulk mode"。您在问题中提供的示例数组很好,然后您可以执行以下操作:
<db:insert config-ref="MySQL_Configuration" bulkMode="true" doc:name="Database">
<db:parameterized-query><![CDATA[
INSERT INTO mytable(id, name)
VALUES (#[payload.id], #[payload.name]);]]>
</db:parameterized-query>
</db:insert>
列表中的每个元素将成为连接器中的 payload
并被插入。您不需要使用 for-each 或任何循环机制。确保传递一个可迭代对象。
Ashok,在此处回复您关于汇总每个人的回复的评论,因为我还不能添加评论。查看以下 link,其中提供了一些选项。
https://forums.mulesoft.com/questions/60273/save-of-for-each-database-query-response-to-a-new.html