Tableau Desktop(twbファイル)のDB接続情報をPythonで書き換える方法


TableauをSSH接続などによってローカルからDB環境に接続している場合、Tableau ServerにPublish後にデータソースの接続情報を書き換える必要があります。
Publish後にいちいち手作業でデータソースの接続設定を書き換えるのは手間なので、Pythonを使って自動でDB接続情報を書き換える方法を紹介します。
Tableau Desktop(twbファイル)の実態はXMLファイルなので、Pythonのライブラリを使えば簡単にパース、書き換えもできてしまいます。
(以下、twbファイルの実態)

環境

  • mac High Sierra 10.13.6
  • Tableau 2019.2.1
  • Python 3.6.6

ディレクトリ構成

config配下に設定ファイル、src配下にpyファイルをおきます。

root/
 ├ config/
 ├ src/

設定ファイル

config配下に以下を作成します。

conf.ini
[file]
# 書き換え対象のtwbファイル
TWB_FILE_PATH =
[parser]
# db接続情報を属性にもつタグ
DB_CONF_PATH = datasources/datasource/connection/named-connections/named-connection/connection
[db]
# 書き換え後のdb接続情報
PORT = 
SERVER = 
DBNAME = 
USERNAME = 
PASSWORD = 

スクリプトファイル

以下のスクリプトを実行することで、twbファイルが書き換えられます。
XMLパースし、attributeを書き換えるだけの処理です。

main.py
import ConfigParser
import os
import sys

import xml.etree.ElementTree as ET

# 設定ファイルの読み込み
conf = ConfigParser()
# iniファイルの絶対パスを指定
conf.read(os.path.dirname(os.path.abspath('__file__')) + '/../config/conf.ini')

try:
    # XMLを解析 
    tree = ET.parse(conf.get('file', 'TWB_FILE_PATH')) 
    # XMLを取得 
    root = tree.getroot()
# twbファイルのXMLパースに失敗した場合
except Exception as e:
    print(f'{e}')
    sys.exit(1)

# DB接続情報が記載されている属性を書き換え
for result in root.findall(conf.get('db', 'DB_CONF_PATH')):
    # 属性の書き換え
    result.set('port', conf.get('db', 'PORT'))
    result.set('username', conf.get('db', 'USERNAME'))
    result.set('dbname', conf.get('db', 'DBNAME'))
    result.set('server', conf.get('db', 'SERVER'))
    result.set('password', conf.get('db', 'PASSWORD'))

# 書き換えたXMLファイルを反映
tree.write(file_path, xml_declaration=True)
print('rewrote db_connection info.')