---
title: 数据映射：二进制对象（第二部分）
date: 2020-10-30
categories:
  - data-integration
  - database-mapping
  - sql
  - tools
tags:
  - binary-objects
  - data-mapping
  - mapforce
description: 将数据库中的二进制对象进行映射，从中提取二进制数据，并以一种易于理解的格式保存，同时尽可能保持与原始数据的忠实性。
---
Status: #blog

Tags:  #binary-objects #data-mapping #mapforce

Categories: [data-integration](/blog/zh/category/data-integration.md) | [database + sql](/blog/zh/category/database-sql.md) 
# 数据映射：二进制对象（第二部分）

二进制对象（BLOB）在数据库中管理起来可能比较麻烦。在之前的文章中，我们描述了一种使用 MapForce 进行数据映射的方法，可以将[二进制对象插入到数据库中](https://www.altova.com/blog/)，并生成元数据，以便后续识别这些 BLOB 对象。数据映射二进制对象的另一个重要挑战是从中提取二进制数据，并将其保存为一种易于理解的格式，同时尽可能保持与原始数据的忠实性。

我们来了解一下它是如何实现的。

![](/blog/images/blob-extraction.png)

<!--more-->

MapForce 内置的 `write-binary-file` 函数可以将数据库中的 BLOB (二进制大对象) 值提取出来，并将其写入文件。我们将扩展 MapForce 在线帮助文档中的示例，以补充之前的文章。我们修改后的映射方案使用运行时提供的参数，从数据库中提取一个或多个二进制对象。

最初的设计目的是使用 SQLite 数据库来跟踪各种二进制文件资产，这些资产用于支持市场部门的产品。这些二进制数据可以包括产品Logo图像文件、产品数据表的PDF文件、产品使用截图、照片、视频文件等。我们的数据库表包含产品元数据、资产类型以及每个原始文件名。

我们首先对二进制对象进行数据映射，以便提取数据。为此，我们将数据库导入到一个新的映射配置中。这次，我们不会选择一个表来进行映射，而是会创建一个包含参数的SQL SELECT查询，用于根据产品和资产类型的元数据字段来过滤结果。这个SELECT语句将返回一个或多个BLOB（二进制大型对象）以及它们原始的文件名。

[![创建一个带有参数的SELECT查询，用于提取BLOB数据](/blog/images/create-query.png)](create-query.png)

接下来，我们点击映射面板中的“SELECT”语句，以显示用于映射的参数

[![将带有参数的查询添加到数据映射中](/blog/images/insert-call.png)](insert-call.png)

现在，每个独立的参数和输出结果都已可用

[![SELECT语句及其所有参数和输出结果的视图](/blog/images/mapping-2-1.png)](mapping-2-1.png)

通过“插入”菜单或工具栏上的相应图标，我们可以插入一个特殊字段，用于在设计阶段进行测试。在后续的自动化执行过程中，我们可以提供新的参数值，以覆盖默认设置。

[![为查询参数添加默认值](/blog/images/create-input.png)](create-input.png)

您可以在输入定义对话框中指定一个设计时的默认值，但我更喜欢将默认值作为字符串常量来提供，就像上面所示。 这样，默认值无需打开对话框即可查看，并且修改测试用的值也更加快捷。

我们将按照 MapForce 帮助文档的说明进行操作 [数据映射二进制对象的示例](https://www.altova.com/manual/Mapforce/mapforceenterprise/mff_binary_example_write.html) 用于创建 SELECT 查询结果的映射关系。以下是完整的映射关系：

[![一个完整的数据映射示例，用于从数据库中提取二进制对象](/blog/images/mapping-3.png)](mapping-3.png)

该映射中突出的 `write-binary-file` 函数会将数据库中二进制对象的内容保存到指定的文件中，该文件路径由 `filepath` 输入参数提供。

我们对示例映射进行了两次改进。在原始示例中，二进制文件的文件名使用了固定的字符串值，但我们现在从数据库中获取原始文件名。此外，我们还提供了一个名为“userPath”的输入对象，用于将文件夹路径和文件名连接起来。

现在，我们可以通过点击映射设计面板底部的“输出”按钮来测试映射效果。MapForce 会执行查询，并使用在映射中定义的参数。然后，会打开“输出”窗口：

[![成功提取 BLOB 后的输出消息](/blog/images/output-1.png)](output-1.png)

第一个输出结果只是我们附加到 `write-binary-file` 函数的消息。点击右箭头图标可以打开第二个输出结果。下图显示了当我们点击“使用...”（或类似选项）按钮，并将 Windows 照片查看器设置为用于打开 .png 文件的默认应用程序后的显示效果。

[![数据库中提取的二进制对象的预览](/blog/images/output-2-1.png)](output-2-1.png)

提供的文件路径为“C:\\projects\\objects”，数据库中存储的文件名为“diffdog_2021.png”。照片窗口中显示的文件名“~mf95AE.png”只是输出预览的随机名称。在“输出”菜单中，提供了一个选项，可以永久保存该文件

[![保存已预览的数据映射结果](/blog/images/output-menu-1.png)](output-menu-1.png)

我们可以修改参数，然后进行另一次测试。这次，我们将使用 SQLite 的通配符来匹配数据库中的任何内容，用于资产参数：

[![更改一个参数值，用于另一个测试。](/blog/images/mapping-4.png)](mapping-4.png)

这次当我们点击“输出”按钮时，会检索到多个二进制对象：

[![通过使用通配符参数值，提取多个二进制对象](/blog/images/output-3.png)](output-3.png)

点击查看所有二进制文件搜索结果，我们看到其中一个结果是PDF格式的数据手册，一个结果是.png格式的截图，还有一个结果是.png格式的Logo

[![预览多个提取的二进制对象](/blog/images/output-4.png)](output-4.png)

### 自动映射数据到二进制对象

为了扩展我们的应用场景需求，假设我们需要允许任何团队成员根据需要从数据库中检索产品资源。MapForce Server 基于在 MapForce 中设计的优化数据映射，执行[自动数据转换](https://www.altova.com/zh/mapforce-server)。

可以将一份 MapForce Server 安装在网络服务器上，并使其对多个用户可用。然后，我们只需要将数据映射关系保存为 MapForce Server 的执行文件（.mfx），具体操作可以在 MapForce 的“输出”菜单中完成。我们将使用文件名 "extract-product-assets-from-DB.mfx"。

[![创建可执行文件，以自动化数据映射过程，特别是针对二进制对象](/blog/images/compile.png)](compile.png)

然后，任何经过身份验证的用户都可以通过命令行执行数据映射。映射中“product”、“asset”和“userPath”这些输入组件的参数，将在运行时由命令行指定。我们甚至可以在一个批处理文件中创建一个示例命令行，用户可以根据需要进行编辑和运行：

[![命令行示例，用于自动化数据映射二进制对象](/blog/images/command-line.png)](command-line.png)

添加注释，列出每个参数的可能取值，并附带编辑说明，是一个相对简单的任务。

为了实现更高级别的自动化生产，MapForce 的映射配置可以部署到 FlowForce Server 中，并且 [根据各种触发条件执行](https://www.altova.com/zh/flowforceserver). 要开始您自己的数据映射、转换和处理项目，请 [下载免费试用版](https://www.altova.com/zh/download) 包括教程、帮助文档以及更多示例！
