Informatica Reference360のCodelistからまとめて値を削除する方法

こんにちは！今回は、Pythonを使ってInformatica Reference360のCodelistからまとめて値を削除する方法をご紹介します。このスクリプトを使えば、指定されたCSVファイルからコードを読み取り、REST APIを通じて値を一括削除できます。
Reference360では参照データを扱うため本来更新頻度は低いのですが、開発やテストではCodelistからまとめてデータを削除する必要が出てきます。その際にこの記事を参考にしてください。
※ REST APIはPython以外でも実行可能ですのでお好みのプログラミング言語で開発してみてください！

## 準備

### Pythonのインストール

まず、Pythonをインストールしていない場合は、以下の手順でインストールしてください。

1. [Pythonの公式サイト](https://www.python.org/)にアクセスします。
2. ダウンロードページから、お使いのOSに対応する最新版のPythonをダウンロードします。
3. ダウンロードしたインストーラーを実行し、インストールを完了します。この際、「Add Python to PATH」のオプションにチェックを入れることを忘れないでください。

### ライブラリのインストール

次に、以下のライブラリをインストールしておきます。

```bash
pip install requests
```

## スクリプトの概要

以下が完成したスクリプトです。
このスクリプトでは、CSVファイルから削除するCodeを読み込み、APIでコードリスト値を削除します。

```python
import requests
import csv

# YOUR CONFIGURATIONS HERE
base_url_login = "https://dm-apne.informaticacloud.com" 
base_url = "https://apne2-mdm.dm-apne.informaticacloud.com" 
username = "your_username_here" 
password = "your_password_here" 
codelist_id = "your_codelist_id_here" 
codes_to_delete_file_path = "codes.csv"

# Construct login URL
login_url = f"{base_url_login}/saas/public/core/v3/login"

# Login credentials
login_payload = {
    "username": username,
    "password": password
}

# Make the login request
login_response = requests.post(login_url, headers={"Accept": "application/json", "Content-Type": "application/json"}, json=login_payload)

if login_response.status_code == 200:
    session_id = login_response.json().get("userInfo").get("sessionId")
    print("Login successful. Session ID obtained.")

    url = f"{base_url}/rdm-service/external/v1/codelists/{codelist_id}/codevalues"
    headers = {
        "Content-Type": "application/json",
        "IDS-SESSION-ID": session_id
    }

    # Read codes from CSV file with utf-8 encoding
    codes_to_delete = []
    with open(codes_to_delete_file_path, 'r', encoding='utf-8') as file:
        reader = csv.DictReader(file)
        for row in reader:
            codes_to_delete.append(row['Code'])

    for code in codes_to_delete:
        payload = {
            "Codes": [code]
        }
        # Delete codelist value
        response = requests.delete(url, headers=headers, json=payload)

        if response.status_code == 200:
            delete_response = response.json()
            if "failedRecords" in delete_response and delete_response["failedRecords"]:
                for failed_record in delete_response["failedRecords"]:
                    code = failed_record.get("Code", "N/A")
                    for error in failed_record.get("errorCauses", []):
                        error_code = error.get("errorCode", "N/A")
                        error_summary = error.get("errorSummary", "N/A")
                        print(f"Failed to delete code: {code}. Error Code: {error_code}, Error Summary: {error_summary}")
            else:
                print(f"Successfully deleted the code: {code}")
        else:
            print(f"Failed to delete the code: {code}. Status code: {response.status_code}, Response: {response.text}")
else:
    print(f"Login failed. Status code: {login_response.status_code}, Response: {login_response.text}")

```

## コードの説明

### YOUR CONFIGURATIONS HERE（ここに設定を記述）

スクリプトの最初の部分で、APIエンドポイントや認証情報、削除したいコードが含まれるCSVファイルのパスなどを設定します。

### Make the login request（ログイン）

`requests.post`メソッドを使用してログインリクエストを送信し、セッションIDを取得します。このセッションIDは後のAPIリクエストで使用されます。

### Read codes from CSV file with utf-8 encoding（CSVファイルの読み込み）

`csv.DictReader`を使ってCSVファイルからコードを読み込みます。CSVファイルはUTF-8エンコーディングで読み込まれ、各行の`Code`列の値を取得します。

### Delete codelist value（コード値の削除）

各コードについて、削除リクエストを送信し、レスポンスのステータスコードをチェックします。削除に失敗した場合は、エラーコードとエラー概要を出力します。

## スクリプトの使い方

### 1. スクリプトの設定

スクリプトの冒頭にある設定セクションで、以下の情報を自分の環境に合わせて変更します。

- `base_url_login`: Informatica CloudのログインURL
- `base_url`: Informatica Reference360のベースURL
- `username`: Informatica Cloudのユーザー名
- `password`: Informatica Cloudのパスワード
- `codelist_id`: 削除対象のCodelistのID
- `codes_to_delete_file_path`: 削除対象のコードが含まれるCSVファイルのパス

codelist_idはReference360 > CodelistのURLから取得可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950384/712e4380-cc0f-e339-6a43-737119ad8667.png)

ファイル名は任意ですが、本記事では delete_r360_codelist_values.py として保存しておきます。


### 2. CSVファイルの準備

削除したいコードを含むCSVファイルを準備します。以下のような形式で、`Code`列に削除したいコードを記載します。他の列は必要に応じて追加・削除していただいて構いません。

```csv
Name,Code,Description,status.status.key,effectiveDate
name1,code1,,,
name2,code2,,,
name3,code3,,,
name4,code4,,,
name5,code5,,,
```
このレイアウトのCSVファイルはReference360 > Codelist > Export Values から出力可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3950384/aadcaca4-1382-ccd8-566f-58944fa29166.png)


### 3. スクリプトの実行

設定を完了したら、ターミナルやコマンドプロンプトでスクリプトを実行します。

```bash
python delete_r360_codelist_values.py
```

スクリプトを実行すると、APIにログインしてセッションIDを取得し、CSVファイルからコードを読み取って順次削除します。削除結果はコンソールに出力され、成功や失敗の情報が表示されます。

### まとめ

このスクリプトを使えば、簡単にInformatica Reference360のCodelistから値をまとめて削除することができます。設定を変更するだけで、他の環境や認証情報にも対応可能です。

ぜひこのスクリプトを試してみてください！

### 参考資料
今回のスクリプトでは以下のInformatica APIを利用しています。製品マニュアルも参照してください。

- [Informatica CloudへのLogin](https://docs.informatica.com/data-science-and-machine-learning/model-serve/current-version/rest-api-reference/platform-rest-api-version-3-resources/login.html)
- [Reference360のCodelist値をDelete](https://docs.informatica.com/master-data-management-cloud/reference-360-saas/current-version/reference-360/reference-360-rest-api/codelists/delete-code-values.html)