此多部分教程介绍如何为 Power Query 创建新的数据源扩展。 本教程旨在按顺序完成 — 每个课程都基于在上一课中创建的连接器上构建,以增量方式向连接器添加新功能。
在本课中,你将:
- 使用 Power Query SDK 创建新的数据连接器项目
- 创作用于从源拉取数据的基函数
- 在 Power Query SDK 中测试连接器
- 在 Power BI Desktop 中注册连接器
创建基本 OData 连接器
在本部分中,你将创建新的数据连接器项目,提供一些基本信息,并在 Power Query SDK 中对其进行测试。
打开 Visual Studio Code。 建议创建新的工作区,然后创建新的扩展项目。 若要创建新扩展项目,请打开资源管理器,然后在 “Power Query SDK ”部分选择“ 创建扩展项目 ”按钮。
选择此按钮后,系统会提示输入新项目的名称。 将此新项目 TripPin命名为 。
打开 TripPin.pq 文件并粘贴以下连接器定义。
section TripPin;
[DataSource.Kind="TripPin", Publish="TripPin.Publish"]
shared TripPin.Feed = Value.ReplaceType(TripPinImpl, type function (url as Uri.Type) as any);
TripPinImpl = (url as text) =>
let
source = OData.Feed(url)
in
source;
// Data Source Kind description
TripPin = [
Authentication = [
Anonymous = []
],
Label = "TripPin Part 1 - OData"
];
// Data Source UI publishing description
TripPin.Publish = [
Beta = true,
Category = "Other",
ButtonText = { "TripPin OData", "TripPin OData" }
];
此连接器定义包含:
- TripPin 连接器的数据源定义记录
- 隐式(匿名)是此源的唯一身份验证类型声明
- 具有调用
TripPinImpl的实现的函数 () - 设置参数类型为
Uri.Type的共享函数 (TripPin.Feed) - 数据源发布记录,允许连接器显示在“Power Query 获取数据 ”对话框中
打开 TripPin.query.pq 文件。 将当前内容替换为对导出的函数的调用。
TripPin.Feed("https://services.odata.org/v4/TripPinService/")
在测试连接器之前,您需要先构建它。 若要生成连接器,请转到 终端 并选择 “运行生成任务...” 选项(键盘快捷方式 Ctrl + Shift + B)。 建议选择 MakePQX 选项,但可用于生成的任一选项都应正常工作。
此作的结果将创建一个新的 Bin 文件夹,其中生成的连接器存储为 TripPin.mez。
<project.query.pq> 文件用于测试扩展,而无需将其部署到 Power BI Desktop 的 bin 文件夹。 使用 Power Query SDK 中提供的工具:
- 选择“ 设置凭据”选项。
- 选择 TripPin 作为数据源。
- 选择 TripPin.query.pq 文件作为查询/测试文件。
- 选择 匿名 作为身份验证类型。
在输出对话框中,将显示一条消息,确认为数据源设置凭据,以及创建的每个凭据的详细信息。
注释
始终可以使用 “清除所有凭据 ”命令清除凭据,或使用 Power Query SDK 工具中的 “列表凭据 ”命令检查可用凭据。
现在已准备好凭据后,可以选择TripPin.query.pq文件,然后在文档中右键点击以执行当前Power Query文件评估,或使用Power Query SDK工具中的选项评估当前文件。
输出对话框显示评估结果的消息,并打开一个名为PQTest result的新窗口。
PQTest 结果窗口由三个选项卡组成:
- 输出:在网格中显示数据的预览。
- 摘要:常规评估详细信息,例如 StartTime、EndTime、Duration、用于评估的文件、状态等。
- DataSource:提供有关从 Kind、函数名称和路径使用的数据源的信息。
可以在测试文件中尝试几个不同的 OData URL,了解返回的不同结果。 例如:
https://services.odata.org/v4/TripPinService/Mehttps://services.odata.org/v4/TripPinService/GetPersonWithMostFriends()https://services.odata.org/v4/TripPinService/People
TripPin.query.pq 文件可以包含单个语句、let 语句或完整节文档。
let
Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/"),
People = Source{[Name="People"]}[Data],
SelectColumns = Table.SelectColumns(People, {"UserName", "FirstName", "LastName"})
in
SelectColumns
重要
请确保始终在工作时保存文件。 如果对 TripPin.pq 文件进行更改,应始终触发后续生成任务,以确保针对最新版本的连接器进行测试。
打开 Fiddler 以捕获 HTTP 流量,并运行查询。 应会看到一些不同的请求来 services.odata.org,由混合容器进程生成。 可以看到,访问服务的根 URL 会导致 302 状态和重定向到 URL 的较长版本。 跟随重定向是由基本库函数“免费”提供的另一种行为。
如果查看这些 URL,会发现由于SelectColumns语句导致的查询折叠。
https://services.odata.org/v4/TripPinService/People?$select=UserName%2CFirstName%2CLastName
如果将更多转换添加到查询,可以查看它们如何影响生成的 URL。
需要注意此行为。 即使未实现显式折叠逻辑,连接器也会从 OData.Feed 函数继承这些功能。 M 语句是可组合的——筛选条件会尽可能从一个函数传递到另一个函数。 此行为在概念上与连接器中使用的数据源函数继承其身份验证上下文和凭据的方式类似。 在后面的课程中,你将把使用具有本机折叠功能的 OData.Feed 替换为使用不带本机折叠功能的 Web.Contents。 若要获得相同的功能级别,需要使用 Table.View 接口并实现自己的显式折叠逻辑。
在 Power BI Desktop 中加载扩展
若要在 Power BI Desktop 中使用扩展,需要将连接器项目的输出文件 (TripPin.mez) 复制到自定义连接器目录。
- 创建 [我的文档]\Power BI Desktop\自定义连接器 目录。
- 将扩展文件 (TripPin.mez) 复制到此目录中。
- 在 Power BI Desktop 中选中选项 (不建议)允许任何扩展加载时不进行验证或警告(在 文件>选项和设置>选项>安全>数据扩展下)。
- 重启 Power BI Desktop。
- 选择“ 获取数据 > 更多 ”以显示“ 获取数据 ”对话框。
可以通过在搜索框中键入其名称来查找扩展。
选择函数名称,然后选择 “连接”。 将显示第三方消息 - 选择 “继续” 继续。 此时会显示函数调用对话框。 输入服务的根 URL(https://services.odata.org/v4/TripPinService/),然后选择“ 确定”。
由于此实例是第一次访问此数据源,因此会收到凭据提示。 检查是否选择了最短 URL,然后选择“ 连接”。
请注意,导航器会出现,而不是显示一个简单的数据表。 导航器之所以出现,是因为 OData.Feed 函数返回一个表,上面有特殊元数据,Power Query 体验知道该表显示为导航表。 本演练介绍如何在未来的课程中创建和自定义自己的导航表。
选择 “Me ”表,然后选择“ 转换数据”。 请注意,这些列已经分配了类型(嗯,其中大多数)。 此行为是基础 OData.Feed 函数的另一个功能。 如果在 Fiddler 中查看请求,可以看出你获取了服务的$metadata文档。 引擎的 OData 实现会自动执行此作,以确定服务的架构、数据类型和关系。
结论
本课程指导你完成基于 OData.Feed 库函数的简单连接器的创建。 正如你所知,在 OData 基础函数上实现一个完全功能的连接器所需的逻辑很少。 其他已启用扩展性的函数,例如 ODBC。DataSource 提供类似的功能。
在下一课中,你将 OData.Feed 的使用替换为功能较低的函数 -Web.Contents。 每节课程都实现了更多增强的连接器功能,包括分页、元数据/架构检测以及查询折叠到 OData 查询语法,直到您的自定义连接器具备与 OData.Feed 相同的功能范围。