도움이 되는 기록들

태블로 Server Client API 로 DataSource 변경하기

태블로 서버를 관리할 때 Tableau Server Client for Python 를 활용하여 programmatic 한 방법으로 편하게 관리할 수 있다.

상당 부분의 작업은 UI 를 통해 수행할 수 있지만, 시스템 전체적인 변경이나 관리는 API 를 활용하는 게 효율적이다. 예를 들어 데이터 소스로 쓰고 있는 DB 의 호스트가 변경되었을 때 해당 DB 를 사용하는 데이터 소스를 일일히 수작업으로 변경하기 보다는 API 를 활용하여 벌크로 수정할 수 있다.

# tableauserverclient 설치
pip install --upgrade pip
pip install tableauserverclient
# 토큰 값과 server url 로 인증

import tableauserverclient as TSC
from dataclasses import dataclass

SITE_NAME = '' # 별도의 사이트가 없으면 비워두어도 됨
TOKEN_NAME = '' # required
TOKEN_VALUE = '' # required

tableau_auth = TSC.PersonalAccessTokenAuth(TOKEN_NAME, TOKEN_VALUE, SITE_NAME)
server_url = '' # required
@dataclass
class Connection:
    datasource_id: str
    connection_id: str

cons = []
server = TSC.Server(server_url, use_server_version=True)
with server.auth.sign_in(tableau_auth):
    
    # 1. 워크북 커넥션을 순회하여 Clickhouse 를 데이터 소스로 쓰고 있는 커넥션을 선별한다.
    all_workbooks, pagination_item = server.workbooks.get()
    for idx, workbook in enumerate(all_workbooks):
        server.workbooks.populate_connections(workbook)
        for connection in workbook.connections:
            if connection.connection_type == 'clickhouse_jdbc':
                cons.append(Connection(datasource_id=workbook.id, connection_id=connection.id))
    
    endpoint = server.workbooks
    update_function = endpoint.update_connection
    
    # 2. 선별한 커넥션의 호스트를 변경해야하는 호스트로 수정한다.
    for con_info in cons:
        resource = endpoint.get_by_id(con_info.datasource_id)
        endpoint.populate_connections(resource)
        connections = list([x for x in resource.connections if x.id == con_info.connection_id])
        assert len(connections) == 1
        connection = connections[0]
        
        connection.server_address = '' # 변경할 clickhouse DB host
        connection.embed_password = True
        print(update_function(resource, connection).__dict__)

    print(f'{len(cons)} updated')

참고