基于Ruby调用Metabase API:如何添加过滤器获取问题数据
解决方案
一、通过Metabase API传递多值过滤器
针对你需要查询GRID表并按指定字段多值过滤的需求,可通过两种HTTP请求方式实现:
1. 基于已保存问题(Card)的参数化查询
如果已创建针对GRID表的保存问题,直接调用该问题的查询API并传入过滤参数:
- 请求方式:
POST - 地址:
https://你的Metabase域名/api/card/{card_id}/query - 请求头:需携带
X-Metabase-Session(登录后获取的会话Token)、Content-Type: application/json - 请求体示例:
{ "parameters": [ { "type": "category", "target": ["dimension", ["field", 你的字段ID, null]], "value": [513, 556, 928] } ] }
说明:
type需匹配字段类型(数值型用number,分类字段用category),target对应目标过滤字段,value为多值数组。
2. 直接执行原生SQL查询
无需依赖保存的问题,直接通过/api/dataset端点执行参数化SQL:
- 请求方式:
POST - 地址:
https://你的Metabase域名/api/dataset - 请求体示例:
{ "native": { "query": "SELECT * FROM GRID WHERE \"你的字段名\" IN (?, ?, ?)", "params": [513, 556, 928] }, "type": "native" }
说明:用参数化查询避免SQL注入,替换
你的字段名为实际字段名称。
二、处理100万+行的大数据量获取
直接返回JSON会导致超时或内存溢出,推荐以下两种高效方式:
1. 导出为CSV文件并流式处理
Metabase支持将查询结果导出为CSV,适合大数据量场景:
- 请求方式:
POST - 地址:
https://你的Metabase域名/api/card/{card_id}/export/csv - 请求头:携带会话Token,可添加
Accept: text/csv - Rails中流式写入文件的代码示例:
require 'net/http' require 'uri' uri = URI("https://你的Metabase域名/api/card/123/export/csv") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true request = Net::HTTP::Post.new(uri) request["X-Metabase-Session"] = "你的会话Token" request["Content-Type"] = "application/json" request.body = { parameters: [{ type: "category", target: ["dimension", ["field", 你的字段ID, null]], value: [513,556,928] }] }.to_json # 流式写入文件,避免内存占用过高 File.open("grid_data.csv", "wb") do |file| http.request(request) do |response| response.read_body do |chunk| file.write(chunk) end end end
后续可使用CSV.foreach逐行解析文件,降低内存压力。
2. 分页查询(适合需实时处理的场景)
通过limit和offset参数分批获取数据,示例请求体:
{ "parameters": [...], "limit": 1000, "offset": 0 }
循环递增offset值,直到返回结果为空即可完成全量数据获取。
注意事项
- 确保Metabase用户拥有
GRID表的查询/导出权限 - 会话Token可通过
POST /api/session接口获取,请求体为{ "username": "你的账号", "password": "你的密码" } - 若遇超时,可在Metabase后台调整
MB_API_REQUEST_TIMEOUT等配置参数
内容的提问来源于stack exchange,提问作者cefsdp
相关产品推荐
相关产品推荐

