首页 > 解决方案 > 是否可以通过 REST API 从 Metabase MBQL / SQL 查询中获取原始数据?

问题描述

是否有接受 MBQL/SQL 查询并返回原始数据的 Metabase REST API?

我可以通过 API 在两步过程中执行 MBQL 查询,方法是执行通过 Metabase Web 应用程序 UI 创建问题的中间步骤,然后查询问题,但我还没有想出如何将 MBQL 与 REST 结合起来API 一步到位。

我想通过在 API 请求中使用 MBQL 而不是 UI 生成的问题来完成一些项目:

  1. 更好的版本管理,因为可以使用代码将 MBQL 查询签入源代码控制
  2. 更好的隔离,因为 API 调用不会依赖于可以改变的问题

以下是有关如何执行两步过程的一些信息。

两步过程

两步过程是:

  1. 使用 Web 应用程序创建 MBQL/SQL 元数据库问题
  2. 使用 REST API 查询使用 Card API 在 Web 应用程序中创建的现有问题

步骤 1) 通过 Web UI 创建问题

登录网络应用程序,然后单击顶部菜单中的“新问题”按钮。

创建问题后,您将被定向到如下所示的 URL,其中:question-id是整数。

记下此值并在下一步的 API 中使用它。

注意:创建卡片的另一种方法是使用每个YakovL的POST /api/cardAPI 端点。在某些需要 UI 问题/卡片的情况下,这可能很有用,但我也试图避免首先创建创建卡片/问题,因为我不打算使用 Metabase UI 来使用它们。对我来说避免使用卡片的原因包括需要执行额外的工作来验证卡片查询定义没有更改,但代码中仍有用于创建卡片的 SQL,并在 UI 中生成大量不需要的问题卡片。

步骤 2) 用于问题数据的 REST API

API 使用术语“卡片”来表示 Web UI “问题”对象,因此对以下卡片 API 进行 API 调用:

在这个网址中:

API 文档中提供了有关 API 的更多信息:

https://github.com/metabase/metabase/blob/master/docs/api-documentation.md

问题

有没有办法通过在 API 请求中一步发送 MBQL/SQL 查询来直接执行此操作而无需预先存在的问题/卡片?

标签: sqlrestmetabase

解决方案


通过 API 可以使用原始 SQL 和 MBQL 进行查询POST /api/dataset/。端点的文档提到了query请求定义,但没有定义它。

我最终做了更多的研究并在 Metabase Discourse 论坛上提问。以下示例由sbelak发布。

原始 SQL 查询

我能够使用go-metabase SDK 成功地进行本机 SQL 查询以发出以下请求:

POST /api/dataset
Content-Type: application/json
X-Metabase-Session: <sessionId>

{
  "database": 1,
  "native": {
    "query": "SELECT COUNT(*) FROM orders"
  },
  type: "native"
}

笔记:

  1. POST /api/dataset不设置响应标Content-Type头。
  2. 有一个POST /api/dataset/json端点,但似乎不接受该native属性。
  3. 设置X-Metabase-Sessionoauth2more/metabase

MBQL

POST /api/dataset
Content-Type: application/json
X-Metabase-Session: <sessionId>

{
  "database": 1,
  "type": "query",
  "query": {
    "source-table": 2, 
    "breakout": [
      [
        "binning-strategy", ["field-id", 14], "default"
      ]
    ],
    "aggregation": [["avg", ["field-id", 17]]]
  }
}

笔记:

  1. 设置X-Metabase-Sessionoauth2more/metabase

推荐阅读