工具:Pycharm
解释器版本3.6
系统:Windows10
编辑工具:Markdown Nice
其他:Excel
一、背景
当我们在Tableau Server设置多个站点时,为了方便统一规范和监控管理,是否需要汇总数据库表清单等,人工维护会存在滞后性和遗漏的可能,所以考虑用程序进行自动提取。
批量获取Tableau Server上发布数据源
使用 Tableau Server Client(Python)批量获取的所有工作薄和发布数据源。不过有个前提,就是你至少得是Tableau Server的站点管理员用户,或者是服务器管理员用户.
安装 Tableau Server Client(Python):
WINDOS环境:
快捷键 WIN+R 运行 CMD
输入:
pip install tableauserverclient
令牌获取
登录 Tableau Server 获取 TOKEN_NAME 和 TOKEN_VALUE 和 SITENAME
右上角账户菜单>我的账户设置
找到个人访问令牌,进行生成并记录令牌信息;
代码部分
1. 配置令牌登录信息:
import tableauserverclient as TSC
# https://tableau.github.io/server-client-python/docs/api-ref#data-sources
# 登录信息
# 默认站点名为""
server_address = 'https://tableau.XXXXX.com/' # 输入你的tableau server地址
site_name = '' #站点名称,主站点默认为''
token_name = '输入你设置的token name'
token_value = '输入你的令牌token'
2. 构建空的DataFrame 用以存储后续的站点信息
import pandas as pd
df = pd.DataFrame (columns= [ '站点名称', '站点id','数据源名称','数据源id','是否数据提取','数据库地址'])
3. 获取所有站点的数据源信息
import tableauserverclient as TSC
import pandas as pd
# https://tableau.github.io/server-client-python/docs/api-ref#data-sources
# 登录信息
# 默认站点名为""
server_address = 'https://tableau.XXXXX.com/' # 输入你的tableau server地址
site_name = '' #站点名称,主站点默认为''
token_name = '输入你设置的token name'
token_value = '输入你的令牌token'
## 登录配置
tableau_auth = TSC.PersonalAccessTokenAuth(token_name, token_value, site_name)
server = TSC.Server(server_address, use_server_version=True)
# 构建空的DataFrame
df = pd.DataFrame (columns= [ '站点名称', '站点id','数据源名称','数据源id','是否数据提取','数据库地址'])
# 登入
with server.auth.sign_in(tableau_auth):
# 获取所有站点信息 all_sites
all_sites, pagination_item = server.sites.get()
# 遍历切换站点进行读取操作
for site_sw in all_sites:
# 切换站点 [content_url:站点的路径,name:站点的名称]
server.auth.switch_site(site_sw)
# 获取当前站点下所有的 数据源信息
all_datasources, pagination_item = server.datasources.get()
# 遍历数据源
for i in all_datasources:
# 填充数据源的连接 来自 Tableau Server 的响应不包含有关 组成工作簿的视图或连接
# 如果要获取视图和连接,则需要调用`populate_connections`函数
# datasource = server.datasources.get_by_id(i.id)
# 把 对象传入 填充相关数据
server.datasources.populate_connections(i)
# 指定数据源的数据连接列表 ()。必须先调用该方法才能访问此数据
connection = i.connections[0]
data_info={
'站点名称':site_sw.name,
'站点id':site_sw.id,
'数据源名称':i.name,
'数据源id':i.id,
'是否数据提取':i.has_extracts,
'数据库地址':connection.server_address
}
# 转化为DataFrame 用concat连接
# 由于Python版本更替的问题,用append添加字典的方法可能失效,这里直接用concat方法 df=df.append(data_info,ignore_index=True)
df2=pd.DataFrame(data_info,index=[0])
# axis=0 纵向连接,ignore_index=True 重新规划 索引
df=pd.concat([df,df2],axis=0,ignore_index=True)
server.auth.sign_out()
4. 存储所有站点的数据源信息
with pd.ExcelWriter("数据源信息表.xlsx",engine='openpyxl') as writer:
df.to_excel(writer, index=True,encoding='UTF-8')
# writer.save()
print("执行完成")
报错提示
如果出现下述错误:
可以通过安装openpyxl
包解决
成果: