- github上的项目地址为
https://github.com/kkjzio/Superset-By-Oauth2-with-Satoken-Demo
前言
使用前得先在super_config.py
的FEATURE_FLAGS
中加上ENABLE_TEMPLATE_PROCESSING:True
使用前得先在super_config.py
的FEATURE_FLAGS
中加上ENABLE_TEMPLATE_PROCESSING:True
使用前得先在super_config.py
的FEATURE_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-jinjatab
对应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_key
2步骤接口中返回的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文档的一处错误勘正:
但是我们一般不用sql结果直接生成csv,该接口输出的文件会有字符转义错误等的问题,因此一般是通过使用permeate生成的永久链接再生成csv文件