Tableau Server как массово обновить имя сервера источника данных?

#python-3.x #tableau-api

#python-3.x #tableau-api

Вопрос:

Наша база данных Oracle обновлена до нового сервера, поэтому у нее новое имя сервера. Большинство наших опубликованных рабочих книг на Tableau Server подключаются к этой базе данных Oracle. Имя пользователя и пароль остаются прежними, но адрес сервера изменен. Я использовал следующий код Python. Он может определить правильную книгу, которая нуждается в обновлении адреса сервера, однако выдает ошибку: «Обновление PW не удалось с ошибкой:

 404004: Resource Not Found
    Datasource '5f125136-22da-48d0-bdc7-8e5edde8d809' could not be found.
  

»’

 import tableauserverclient as TSC
import re

tableau_auth = TSC.TableauAuth('site_admin_username', 'site_admin_password', site_id='default') # site_id not needed if there is only one


search_server_regex = 'oldserver123' # server to search
replace_server = 'newserver123'  # use if server name/address is changing- otherwise make it the same as search_server
overwrite_credentials = False    # set to false to use existing credentials
search_for_certain_users = True # set to True if you only want to update connections for certain usernames
search_username = 'username' 
replace_username = 'username'
replace_pw = 'password'

request_options = TSC.RequestOptions(pagesize=1000) # this needs to be > # of workbooks/data connections on the site

server = TSC.Server('http://tableau_server:8000') # tableau server



y = 0   # to keep track of how many are changed

try:

    
    with server.auth.sign_in(tableau_auth):
        all_workbooks, pagination_item = server.workbooks.get(req_options=request_options)
        print("Total Workbooks to Search: {}".format(len(all_workbooks)))

        for wb in all_workbooks:
            server.workbooks.populate_connections(wb)
            for item,conn in enumerate(wb.connections): #make sure to iterate through all connections in the workbook
                if wb.connections[item].connection_type != 'sqlproxy': #sqlproxy indicates published datasource
                    if re.search(search_server_regex ,wb.connections[item].server_address,re.IGNORECASE):

                        connection = wb.connections[item]

                        if search_for_certain_users and re.search(search_username, connection.username, re.IGNORECASE):

                            # print(wb.name, '-', connection.connection_type)
                            connection.server_address = replace_server
                            connection.embed_password = False

                            if overwrite_credentials:
                                connection.embed_password = True
                                connection.username = replace_username
                                connection.password = replace_pw

                            server.datasources.update_connection(wb, connection)
                            y = y   1

                        elif not search_for_certain_users:

                            # print(wb.name, '-', connection.connection_type)
                            connection.server_address = replace_server
                            connection.embed_password = False

                            if overwrite_credentials:
                                connection.embed_password = True
                                connection.username = replace_username
                                connection.password = replace_pw

                            server.datasources.update_connection(wb, connection)
                            y = y   1


    print("Workbook Connections Changed: {}".format(y))

except Exception as e:
    print("PW Update Failed with error: {}".format(e))
    print("Connections Updated: {}".format(y))
  

»’
Как исправить код?

Комментарии:

1. Похоже, что он пытается обновить источник данных, который больше не существует из-за ошибки. Попробуйте записать список активных источников данных для повторения.

2. Привет, Бернардо, источник данных существует. я попытался выполнить поиск в другом источнике данных. Он идентифицировал источник данных, но получал ту же ошибку.

Ответ №1:

вы должны обновить рабочие книги.

 server.workbooks.update_connection(wb, connection)
  

Ответ №2:

Я столкнулся с той же проблемой, и я надеюсь, что мое решение исправит ваше. Я создал класс «helper», который имеет один атрибут с именем «id»:

 class datasource_id:
    def __init__(self, id):
        self.id = id
  

Я поместил класс в начало своего кода. Затем я заменил строки:

 if overwrite_credentials:
     connection.embed_password = True
     connection.username = replace_username
     connection.password = replace_pw

server.datasources.update_connection(wb, connection)
  

с приведенным ниже кодом в обоих местах:

 if overwrite_credentials:
    connection.embed_password = True
    connection.username = replace_username
    connection.password = replace_pw
                                    
    d1 = datasource_id(wb.connections[item].datasource_id)
    server.datasources.update_connection(d1, connection)
  

Причина этой работы в том, что метод .update_connections использует аргумент в позиции идентификатора «wb» в качестве datasource_id, что неверно, поскольку позиция идентификатора переменной «wb» является идентификатором книги