在我们目前的设置中,我们为每位客户提供了一个单独的项目。客户都拥有相同的仪表板,但数据源不同。每当我们更改一个客户的仪表板时,我们都必须将更改复制到所有其他客户。目前,这是一个手动过程,我们为每个客户重新上传更改的工作簿并替换连接的数据源。 我现在想要将tableaus rest API与document api结合使用,从而实现该流程的自动化。对于数据源,我们不使用超文件而是与数据库建立实时连接。
这是我目前的实施:
tableau_auth = TSC.TableauAuth('admin', 'tableau-admin')
server = TSC.Server('http://localhost:8080')
with server.auth.sign_in(tableau_auth):
# download original workbook
server.workbooks.download(workbook_id=source_work_book_id, filepath="tmp", include_extract=False)
source_wb = Workbook('tmp/source.twbx')
# get datasources which have connections
wb_datasources = [s for s in source_wb.datasources if len(s.connections) != 0]
# mappings to map datasource from source to target datasources
# (all the datasources have the same name but are in different projects)
dbname_to_datasource = {d.content_url: d.name for d in datasources if d.project_id == source_project_id}
source_to_target = {d.name: d.content_url for d in datasources if d.project_id == target_project_id}
# overwrite source datasources
for datasource in wb_datasources:
datasource.connections[0].dbname = source_to_target[dbname_to_datasource[datasource.connections[0].dbname]]
source_wb.save_as("tmp/target.twbx")
# write back to tableau server
new_workbook = TSC.WorkbookItem(target_project_id)
server.workbooks.publish(new_workbook, file_path="tmp/target.twb", mode=TSC.Server.PublishMode.CreateNew)
上传时出现以下错误:
400011: Bad Request
There was a problem publishing the file 'target.twbx'.
如果我重新上传未经修改的工作簿,它甚至不起作用。如果我更改下载以包含提取文件,我可以成功上传未修改的工作簿:
server.workbooks.download(workbook_id=source_work_book_id, filepath=tmp_dir, include_extract=True)
唯一的问题是我现在正在添加不必要的数据,但它也没有解决我如何替换数据源的问题。
有没有人知道我做错了什么,或者有其他方法可以做到这一点吗?