一、背景

我们公司很多部门都有人会用Tableau等可视化开发工具开发各类报表,并发布到报表平台进行共享查看。我所在的团队负责公司BI平台的运维管理,面对数量日益增加的各种报表,为了方便统一规范和监控管理,有一项管理需求就是期望可以及时获知所有报表连接的数据源中所涉及的数据连接信息、数据库表清单等,人工维护显然会存在滞后性和遗漏的可能,所以考虑是否可以用程序进行自动提取。

二、实现思路

搞定Tableau报表所用数据库表的自动批量解析问题,一共需要两步:

第一步:搞定一个报表的自动解析,获取其数据源信息

第二步:把上述解析一个报表的方法封装起来,想办法搞定批量自动操作。

(1)、如何获取一个Tableau报表中的数据源信息?

1、从Tableau Server 的自带存储库获取数据

Tableau Server管理员一般都知道,在Tableau Server服务器上,存在一个PostgreSQL数据库,是Tableau Server安装的同时自动安装的,用于存储和记录Tableau服务器上的配置、用户操作、工作薄、数据源、报表访问记录、数据提取作业等信息,不过默认情况下,该数据库不能通过Tableau Server以外的机器进行远程访问,但是可以进行设置开启,详细操作参见官方文档:启用对 Tableau PostgreSQL 数据库的外部访问。

事实上,如果是服务器管理员或者站点管理员用户,在Tableau Server的管理页面(TSM)上,你可以看到一些服务器监控看板页面,这些监控页面的数据来源就是上述提到的PostgreSQL数据库。如果你觉得Tableau Server上默认提供的监控看板不能满足你当前面临的复杂的服务器管理需求,你完全可以基于这个数据库中的数据记录,去构建和定制自己需要的监控运维看板,前提是理清了这个数据库中各表之间的关联关系,这里有一份Tableau官方的PostgreSQL数据库中的表和字段信息字典,拿走不谢:Tableau Server上的PostgreSQL存储库数据字典。

以下几个表存储了Tableau工作薄中所用的数据源连接信息:

​其中:connection_tables这个表中,记录了Tableau工作薄数据源所连接的表和自定义SQL。我们把这个表的字段单拎出来看:

对于Tableau数据源为直接连接数据库表的,表里会记录一行数据,[type]字段值为'TABLE',[table_value]字段存储的值即为所连的数据库表名,而对于数据源为自定义SQL的,[type]字段值为'CUSTOM_SQL',这段数据库查询的SQL语句则会存储在[custom_sql]字段中 。看到这里,似乎我开头所提到的需求已经基本得到解决了,只要拿到这个表的信息不就全都搞定了!剩下的问题就是对自定义SQL语句进行解析,提取出SQL语句中所涉及的数据库表(关于SQL中提取涉及的数据库表这个问题,论坛中有很多相关话题和技术的讨论,大家可以从中找到解决思路,本文就不多做探讨。)。但实际情况并非这么简单,原因是我后来发现,在这个数据库中,并未存储Tableau发布数据源的中所用的数据库表和自定义SQL信息,而我们目前在用的很多报表,都是连接到发布在Tableau Server上的发布数据源的,这就不能完全解决我的问题。(如果你们并不使用发布数据源,那么看到这里就能解决你的问题了,如果你也和我一样也涉及发布数据源,请继续往下看。)

2、解析Tableau报表文件(.twb)及tableau数据源文件(.tds)获取数据

Tableau报表的所有信息都会存储在报表文件本身之中,所以我们可否尝试解析报表文件,来提取其中的信息呢?答案是 可以 。

众所周知,XML 格式是一种极为通用且使用广泛的信息系统数据传输、存储格式,大量的软件开发商都在自己的产品中采用了这一标准,Tableau也不例外,大家可以尝试下把 .twb 格式的Tableau报表文件后缀改为 .xml,或者甚至直接用文本编辑器打开.twb文件,就会发现,原来Tableau文件的本质也就是XML文件,Tableau软件按照自己设定的规则解析这个XML文件,读取其中存储的信息,最终在软件的界面中渲染成我们所看到的报表样式。

以下是一个示例报表以XML形式打开后的树形结构,其中的datasources节点就存储的是此工作薄中的数据源信息,对该节点展开后经过一番分析,就能找到其中的数据连接信息、数据库表、查询语句等数据的提取规则。如果大家有XML解析经验,或者写过爬虫,有HTML的解析经验,这里的信息提取也就轻车熟路了。

​类似的,对于.tds文件,以XML形式打开后,大家会发现,它的XML结构就是 .twb 文件中的 datasources 节点中的内容,解析方式基本一致。

此外,需要特别补充的一点是:对于Tableau工作薄,除了.twb格式文件外,还有一种叫"打包工作薄",文件后缀为'.twbx',这种则是包含了外部文件的工作薄,他的实质是个'.zip'格式的压缩包文件,我们只需要粗暴地把文件后缀'.twbx'改为'.zip',然后直接进行解压就可以得到其中的.twb格式报表文件和工作薄中包含的其他文件,再对.twb格式报表文件进行解析即可。类似地,数据源文件也有'.tdsx'后缀文件,处理方式相同。

至此,我们基本清楚了单个报表文件的解析思路,按照这个思路去做代码实现即可,剩下的问题就是如何批量获得所有的报表文件和发布数据源,并自动进行解析了。

(2)、批量获取Tableau Server上的所有报表文件和发布数据源。

Tableau的官网上提供了非常全面和详细的官方文档,包括Tableau Desktop、Tableau Server的各种操作、运维文档,还有Tableau的开发文档,其中就包含Tableau REST API文档和基于Tableau REST API做好了封装的Tableau Server Client文档,Tableau Server Client是Tableau官方提供的Python SDK工具包,封装了很多非常有用的开发操作,例如登录鉴权、工作薄、数据源操作、用户管理、服务器管理、任务调度等等,利用它可以进行二次开发实现很多Tableau Server的运维自动化。

Tableau REST API , Tableau Server Client(Python)

我就是使用 Tableau Server Client(Python)批量获取的所有工作薄和发布数据源。不过有个前提,就是你至少得是Tableau Server的站点管理员用户,或者是服务器管理员用户,我们需要在程序中使用这种权限角色的账号密码登录 Tableau Server 。

贴一些关键步骤的示例代码:

安装 Tableau Server Client(Python):

pip install tableauserverclient

在你的Python程序中登录 Tableau Server ,有两种方式:

用令牌登录:

import tableauserverclient as TSC tableau_auth = TSC.PersonalAccessTokenAuth('TOKEN_NAME', 'TOKEN_VALUE', 'SITENAME')
server = TSC.Server('https://SERVER_URL', use_server_version=True) server.auth.sign_in(tableau_auth) # Do awesome things here! server.auth.sign_out()

在使用以上代码之前,你需要先登录 Tableau Server 获取 TOKEN_NAME 和 TOKEN_VALUE 和 SITENAME

其中SITENAME 为你要服务器站点名称,在页面左上角LOGO下面,TOKEN信息的获取页面为服务器上的“我的账户设置”页面下如下图所示位置,点击创建新令牌即可获得。

用账号密码登录:

import tableauserverclient as TSC
tableau_auth = TSC.TableauAuth('USERNAME', 'PASSWORD', 'SITENAME')
server = TSC.Server('https://SERVER_URL', use_server_version=True) server.auth.sign_in(tableau_auth) # Do awesome things here! server.auth.sign_out()

获取指定站点上的所有工作薄清单:

import tableauserverclient as TSC tableau_auth = TSC.TableauAuth('username', 'password', site_id='site')
server = TSC.Server('https://servername')
with server.auth.sign_in(tableau_auth): all_workbooks_items, pagination_item = server.workbooks.get() print([workbook.id for workbook in all_workbooks_items])

以上方法获取到了所有工作薄的ID,我们可以再根据ID逐个下载工作薄:

workbooks.download(workbook_id, filepath='指定的文件路径', no_extract=False)

no_extract=False 参数默认为False,表示下载时不包含数据提取文件,我们这里不需要,所以使用默认设置。

类似的,你也能从中找到下载数据源文件的方法

datasources.download(datasource_id, filepath='指定的文件路径', include_extract=False, no_extract=None)

至此,批量获取到工作薄或数据源文件的思路也理清了,要想解决我开头提到的自动批量解析Tableau报表中数据源所用的数据库表的需求,已经没有技术困难了,剩下的工作就都是写代码的体力活了,详细的代码实现大家可以参照我文中给的文档链接,去官方文档中查找详细的实现代码和说明。

用Python自动批量提取Tableau报表数据源中用的数据库表相关推荐

  1. python实现批量提取指定文件夹下同类型文件

    python实现批量提取指定文件夹下同类型文件 讲解 略 代码 import os import shutildef take_samefile(or_path, tar_path, tar_type ...

  2. python 如何批量提取文件中的字符_如何用Python批量提取PDF文本内容?

    本文为你展示,如何用Python把许多PDF文件的文本内容批量提取出来,并且整理存储到数据框中,以便于后续的数据分析. 问题 最近,读者们在后台的留言,愈发五花八门了. 写了几篇关于自然语言处理的文章 ...

  3. python自动批量删除微信公众号文章

    近期,因为需要删除微信公众号的文章,但是肯定大家都会发现,无法批量删除,公众号的后台需要删除,需要一篇一篇的删除,然后扫码确认才能删除! 这TM的太麻烦了! 后来,发现订阅助手可以再手机上进行一篇篇的 ...

  4. python实现批量提取图片中文字的小工具

    要实现批量提取图片中的文字,我们可以使用Python的pytesseract和Pillow库.pytesseract是一个OCR(Optical Character Recognition,光学字符识 ...

  5. 从图片中(批量)提取化学/分子结构——使用python进行批量提取(代码示例)

    如有不懂,留言评论 化学分子结构识别 example1 example2 首先推荐有兴趣和时间的小伙伴读一篇文章 https://jcheminf.biomedcentral.com/articles ...

  6. Python + Django4 搭建个人博客(六): 数据库表和模型设计

    目录 数据库表设计 数据模型定义 数据模型说明 模块导入 类 字段 数据迁移(Migrations) 结语 上篇我们已经提到,Django是通过模型来对应实体数据库,然后通过ORM来实现对实体数据库的 ...

  7. 用 Python 自动生成 Excel 数据报表~

    大家好,我是小z 今天给大家来一波实战,使用Python自动化生成数据报表! 从一条条的数据中,创建出一张数据报表,得出你想要的东西,提高效率. 主要使用到pandas.xlwings以及matplo ...

  8. easy excel date 类型解析报错_实例1:用Python自动批量生成Excel档物料标签

    作为一个生产型企业,其产品种类繁多.按照客户要求,每种产品在出货时都需要在包装上贴上如下信息标签,以便识别. 标签上需要包含6种信息,原始资料内容如下: 我们注意到原始信息中的品牌,有些是大写,有些是 ...

  9. Python学习-批量提取图片名称保存至txt文件

    个人微信公众号:AI研习图书馆,欢迎关注~ 深度学习知识及资源分享,学习交流,共同进步~ Python提取图片名称保存到txt文件 1. 环境 Windows7+Anaconda3+python 3. ...

最新文章

  1. jQuery与其它库冲突的解决方法(转)
  2. 设置网络映射后,电脑重启后自动重连
  3. Java使用jmeter源码进行接口测试_jmeter用java代码怎样编写接口测试源码
  4. SAP ABAP Netweaver和Hybris Commerce的开发license
  5. SpringBoot—启动报错Exception in thread “main“ java.lang.ClassNotFoundException
  6. 新手如何创建Facebook广告账户?
  7. vscode安装旧版本插件_2020 我在使用VScode时安装的插件(针对前端开花推荐)
  8. 预训练语言模型关系图+必读论文列表,清华荣誉出品
  9. 采用SyncToy2.1软件实现两台电脑间文件的自动实时同步(亲测有效)
  10. 网页版bpc电波对时_电波表对时软件下载-BPC(中国码)电波表对时模拟软件 20170308 官方版 - 河东下载站...
  11. eXosip事件总结
  12. 抽样分布的形式与原有总体的分布和样本容量n的大小有关
  13. Microsoft Excel 最大行数各版本介绍
  14. 【PAT算法之路】 -- 专栏总揽
  15. 【触想智能】工业平板电脑触摸屏选择分析
  16. swagger2 注解
  17. 手机ufs2.1测试软件,都UFS 2.1了 你还不赶紧把TF卡扔掉!-手机评测
  18. spark+smack+openfire实现请求响应简单流程
  19. 【新概念4】【6】the sporting spirit
  20. 卡迈克尔数 Carmichael Numbers(挑战程序设计竞赛)

热门文章

  1. 机器人专业需要学习那些理论知识
  2. 人工智能第八章答案神经网络,神经网络简答题
  3. Seaborn调色板设置
  4. SASS的安装与使用(windows系统)
  5. 装饰者模式---装饰者模式和桥接模式的区别
  6. 程序员工资为什么普遍很高,原来是因为这个。。。
  7. 第二证券|钠电池三种技术路线谁更将率先取代锂电池?
  8. 微软再次荣获 Gartner 工业物联网平台魔力象限“领先者”称号
  9. Python地理位置信息库geopy的使用(一):基本使用
  10. flash调用java_Flash加载swf后互相调用函数、变量