• github上的项目地址为
https://github.com/kkjzio/Superset-By-Oauth2-with-Satoken-Demo

前言

使用前得先在super_config.pyFEATURE_FLAGS中加上ENABLE_TEMPLATE_PROCESSING:True

使用前得先在super_config.pyFEATURE_FLAGS中加上ENABLE_TEMPLATE_PROCESSING:True

使用前得先在super_config.pyFEATURE_FLAGS中加上ENABLE_TEMPLATE_PROCESSING:True

对比起上篇使用筛选器实现动态查询,sqlLab方法能够更加灵活的自定义查询的sql字段,适合用于复杂查询

1.创建sql查询视图

首先通过POST /api/v1/sqllab/execute/执行sql语句,请求体如下:

# superset\sqllab\api.py

{
    "client_id": "12aaa4",
    "database_id": 1,
    "json": true,
    "runAsync": false,
    "schema": "bilibili",
    "sql": "SELECT *\nFROM bilibili.video\nWHERE videoID >={{value1}} AND videoID<={{value2}}",
    "tab": "testSql",
    "templateParams": "{\"value1\": 3,\"value2\":40}",
    "tmp_table_name": "",
    "select_as_cta": false,
    "ctas_method": "TABLE",
    "queryLimit": 10000,
    "expand_data": true
}
  • 其中client_id为本次查询的标识,保证每次查询的随机数不一样即可
  • database_id为预先设定好的所需连接数据库的id,该id可用apiGET /api/v1/database/查询(也可以通过下面读取schema时查询),需要用户有权限访问该数据集才可以执行
  • schema要读取的数据库名(用户必须有权限才可以读取),可用用GET /api/v1/dataset/查询

    • 可以将GET /api/v1/dataset/中的q参数中的值设为下面的json

      {
        "columns": [
          "database.id","database.database_name","schema","table_name"
        ]
      }
      
      # ===> 转化成Json的url参数或者Rison类型的url参数
      
      # json格式
      #/api/v1/dataset/?q=%7B%0A%20%20%22columns%22%3A%20%5B%0A%20%20%20%20%22database.id%22%2C%22database.database_name%22%2C%22schema%22%2C%22table_name%22%0A%20%20%5D%0A%7D
      
      # Rison 格式
      #/api/v1/dataset/?q=(columns:!(database.id,database.database_name,schema,table_name))

      该请求会返回如下的数据

      {
        "count": 1,
        "description_columns": {},
        "ids": [
          1
        ],
        "label_columns": {
          "database.database_name": "Database Database Name",
          "database.id": "Database Id",
          "schema": "Schema",
          "table_name": "Table Name"
        },
        "list_columns": [
          "database.id",
          "database.database_name",
          "schema",
          "table_name"
        ],
        "list_title": "List Sqla Table",
        "order_columns": [
          "table_name",
          "schema",
          "database.database_name"
        ],
        "result": [
          {
            "database": {
              "database_name": "MySQL",
              "id": 1
            },
            "schema": "bilibili",
            "table_name": "video"
          }
        ]
      }

      从中校检database.id和要访问的数据库schema即可

  • sql为要执行的sql语句,注意要用字符串的形式,其中的{{value1}}{{value2}}是来源于templateParams,该sql的语法格式符合Jinja,可以查看官方文档获得更多使用方法:https://superset.apache.org/docs/installation/sql-templating/#templating-with-jinja
  • tab对应UI界面中的SQL LAB的标签,如果该标签有存在的会覆盖掉
  • templateParams用于给sql中的值赋值使用
  • ctas_method图表的展现方式
  • queryLimit传输回来的最大数据数,和LIMIT效果相似

该请求会返回如下的Json信息,主要要拿取其中的query_id,下面即为查询的结果

{
  "query_id": 51,
  "status": "success",
  "data": [
    {....

2.创建新的from_data

我们要将该查询结果放入一个可展示的图表中,故向POST /api/v1/explore/form_data发起请求,请求体如下

{
    "datasource_id": 49,
    "datasource_type": "query",
    "form_data": "{\"metrics\":[],\"groupby\":[],\"time_range\":\"No filter\",\"row_limit\":1000,\"datasource\":\"49__query\",\"all_columns\":[\"videoID\",\"videoName\"]}"
}
  • datasource_id中填入上面请求获得的query_id
  • 可以在form_data中的all_columns设定返回视图中展示的列,注意"datasource":"49__query"要对应datasource_id的值

该接口会返回该图表的key

{
  "key": "8jebyimTrlqeK-mlH_AJmrkXqhHRIsxEuLikV4a8AP4OH7Em32WL9DnZ65cnbWqJ"
}

3.创建图表的永久展示链接

创建图表后,需要向POST /api/v1/explore/permalink发起请求,以获得永久展示链接,请求体为

{
    "formData": {
        "datasource": "49__query",
        "viz_type": "table",
        "url_params": {
            "form_data_key": "8jebyimTrlqeK-mlH_AJmrkXqhHRIsxEuLikV4a8AP4OH7Em32WL9DnZ65cnbWqJ"
        },
        "query_mode": "raw",
        "groupby": [],
        "time_grain_sqla": "P1D",
        "temporal_columns_lookup": {},
        "metrics": [],
        "all_columns": [
            "videoID",
            "videoName"
        ],
        "percent_metrics": [],
        "adhoc_filters": [],
        "order_by_cols": [],
        "row_limit": 1000,
        "server_page_length": 10,
        "page_length":20,
        "order_desc": true,
        "table_timestamp_format": "smart_date",
        "show_cell_bars": false,
        "color_pn": true,
        "extra_form_data": {}
    },
    "urlParams": []
}
  • 同理在formData中可以设定类似上面接口的信息

    • datasource利用2步骤接口的datasource_id拼接而成
    • form_data_key2步骤接口中返回的key
  • page_length设置每页显示的最大数据数量

该接口会返回带图表渲染的的地址

# superset\explore\permalink\api.py

{
  "key": "g7oPy5LPdAm",
  "url": "None/superset/explore/p/g7oPy5LPdAm/"
}

利用此url可以生成可嵌入前端的的链接

<iframe
  width="600"
  height="400"
  seamless
  frameBorder="0"
  scrolling="no"
  src="http://192.168.59.129:8088/superset/explore/p/xynX8k4ZOr2/?standalone=1&height=400"
>
</iframe>

生成xlsx

可以向POST /api/v1/chart/data传参获得xlsx文件,该请求会直接返回文件本体,请求体如下:

{
    "datasource": {
        "id": 94,
        "type": "query"
    },
    "force": false,
    "queries": [
        {
            "columns": [
                "videoID",
                "videoName",
                "videocAtegory",
                "videoTime"
            ],
            "row_limit": 1000,
            "order_desc": true,
            "url_params": {
                "form_data_key": "Qj5SOhCtRglAgH2zWuKofq9ZiHhr2eEdHXC32a_VmdwTMqSK2bs32oPIEWxkBiLh",
                "permalink_key": "K14E19BEweG"
            }
        }
    ],
    "result_format": "xlsx",
     "result_type": "results"
}
  • datasource.id:通过POST /api/v1/sqllab/execute/查询得到的query_id
  • queries.columns:要展示的列
  • queries.row_limit:文件中最数据数
  • queries.url_params:分别为由POST /api/v1/explore/form_data查询得到的form_data_key和由POST /api/v1/explore/permalink查询得到的permalink_key

other:

api文档的一处错误勘正:

image-20240419100442403

但是我们一般不用sql结果直接生成csv,该接口输出的文件会有字符转义错误等的问题,因此一般是通过使用permeate生成的永久链接再生成csv文件

如果对你有帮助就太好了)))