是否可以通过 REST API 从 Metabase MBQL / SQL 查询中获取原始数据?

Posted

技术标签:

【中文标题】是否可以通过 REST API 从 Metabase MBQL / SQL 查询中获取原始数据?【英文标题】:Is it possible to get raw data from a Metabase MBQL / SQL query via the REST API? 【发布时间】:2018-05-31 08:40:08 【问题描述】:

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

我可以通过 API 在两步过程中执行 MBQL 查询,方法是执行通过 Metabase Web 应用程序 UI 创建问题的中间步骤,然后查询问题,但我还没有想出如何组合 MBQL只需一步即可使用 REST API。

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

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

这里有一些关于如何执行两步过程的信息。

两步流程

两步流程是:

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

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

登录网络应用并点击顶部菜单中的“新问题”按钮。

创建您的问题后,您将被定向到如下网址,其中:question-id 是一个整数。

Web UI 端点:GET /question/:question-id

记下这个值,并在下一步的 API 中使用它。

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

第 2 步)问题数据的 REST API

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

API 端点:POST /api/card/:card-id/query/:export-format

在这个网址中:

:card-id 是来自 Web UI URL 的 :question-id :export-format 可以是json 或其他格式

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

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

问题

有没有办法直接在 API 请求中发送 MBQL/SQL 查询,无需预先存在的问题/卡片?

【问题讨论】:

如果您分享第二部分的做法,您的问题将对其他人更有帮助 感谢您的反馈。我更新了问题,提供了有关如何使用两步法完成此任务的信息,以及为什么我更喜欢使用一步法。 非常感谢!我在想我必须使用GET /api/embed/card/:token/query 端点并且很难弄清楚从哪里获取令牌。真的很感激! 顺便问一下,你试过POST /api/card/ endpoint吗?它被描述为创建一张新卡,因此您可能可以分两步完成此操作,但都通过 API 感谢@YakovL 的留言。这确实是一种自动创建卡片的方法,并且值得注意,所以我将它添加到上面的主要问题中。在某些情况下,它可能是一个不错的选择。对于我的特殊情况,使用卡片没有任何好处,所以我想根据上述原因避免使用卡片。 【参考方案1】:

通过原始 SQL 和 MBQL 进行查询都可以通过 POST /api/dataset/ API 获得。端点的文档提到了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"

注意事项:

    POST /api/dataset 未设置响应 Content-Type 标头。 有一个POST /api/dataset/json 端点,但它似乎不接受native 属性。 要设置X-Metabase-Session,请参阅oauth2more/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]]]
  

注意事项:

    要设置X-Metabase-Session,请参阅oauth2more/metabase。

【讨论】:

以上是关于是否可以通过 REST API 从 Metabase MBQL / SQL 查询中获取原始数据?的主要内容,如果未能解决你的问题,请参考以下文章

通过 REST API 查询 HealthKit 数据

通过 REST API 查询 HealthKit 数据

从 .NET Core 应用程序同时提供 REST 和 GraphQL API

Wordpress Rest api 和 ionic

使用 Spring Boot 从不同端口提供 REST API 和静态内容

Google Ads API - 是不是存在 REST API?