在单独列中添加网站名称 - Python 与 Tableau Server

0 投票
1 回答
16 浏览
提问于 2025-04-13 00:43

我写了下面的Python代码,用来从Tableau服务器导出用户列表,这段代码在提取单个站点的数据时运行得很好。但是,如果我们想要同时从多个站点提取数据,Tableau就会给我报错。

这是我运行的代码:

from tableau_api_lib import TableauServerConnection
import pandas as pd
from tableau_api_lib.utils.querying import get_users_dataframe

tableau_server_config = {
        'my_env': {
                'server': 'https://myserver.com',
                'api_version': '3.21',
                'username': 'user',
                'password': 'pass',
                'site_name': ['FT','INT','ss'],
                'site_url': ['FT','INT','ss']
        }
}


conn = TableauServerConnection(tableau_server_config, env='my_env')
conn.sign_in()
users_df = get_users_dataframe(conn=conn)
users_df.drop(columns=['domain', 'externalAuthUserId', 'locale','language'], inplace=True)
print(users_df)

错误信息 -

PaginationError: 
        The Tableau Server REST API method decorator did not return paginated results. 
        Please verify that your connection is logged in and has a valid auth token.
        If using personal access tokens, note that only one session can be active at a time using a single token.
        Also note that the extract_pages() method wrapping this call is intended for paginated results only.
        Not all Tableau Server REST API methods support pagination. 

有没有办法解决这个问题?另外,我希望输出中也能包含站点名称。

有没有人能帮帮我?

谢谢!

1 个回答

0

这个库有一个叫做切换站点的方法。你只需要在你的配置字典里放一个站点。下面是我如何用它来导出所有站点的用户,并根据网址的值创建一个站点名称的列。

from tableau_api_lib.utils import querying

tableau_server_config = {
    'my_env': {
            'server': 'https://myserver.com',
            'api_version': '3.21',
            'username': 'user',
            'password': 'pass',
            'site_name': 'FT',
            'site_url': 'FT'
        }
}
conn = TableauServerConnection(tableau_server_config, env='my_env')
conn.sign_in()

这个操作会查询所有可用的站点,并把结果放到一个数据框里。

sites_df = querying.get_sites_dataframe(conn)

我创建了空列表来存放数据。一个是每个站点的用户数据框,另一个是响应值的列表,以备调试时使用。

frames = []
switch_site_responses = []

for index, row in sites_df.iterrows():
    switch_site_responses.append(conn.switch_site(content_url=row["contentUrl"]))
    users_df = querying.get_users_dataframe(conn)
    users_df['site_name'] = row["contentUrl"]
    frames.append(users_df)

server_users_df = pd.concat(frames)

撰写回答