CData PowerShell Cmdlets でSalesforce データをMySQL にレプリケーション

CData PowerShell Cmdlets（[https://www.cdata.com/jp/powershell/](https://www.cdata.com/jp/powershell/)） は、標準PowerShell モジュールで、直観的に200+ 種類の人気のNoSQL、CRM、ERP、会計、マーケティングオートメーション、クラウドプラットフォームにデータ連携を実現します。Cmdlets を使えば、RDB と同感覚でシンプルなTransact-SQL を使って、データ連携が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/5f7c7d51-3e05-0f98-f51c-bf9a1b6b02dd.png)

## CData PowerShell Cmdlets の機能概要

* SQL インターフェースで簡単に使えるCmdlets でSalesforce データに連携。

* Cmdlet によるデータ操作では、基本となるSelect-Salesforce、Add-Salesforce、Update-Salesforce、Remove-Salesforce のほか、任意のSQL クエリを実行するInvoke-Salesforce や、Sync-Salesforce などのcmdlet が使えます。

* PowerShell Gallery を経由した合理化されたインストール操作

* PowerShell 2、3、4、および5 をサポート

* フラットファイル、DB へのパイプ処理を簡単に実行

## CData PowerShell Cmdlets の使いどころ

世の中にはいろいろなクラウドデータの連携ツールがありますが、どんな場合にメリットがあるのでしょうか？まずは、データ連携でもクラウドのデータをオンプレのDB に同期する・バックアップするというシナリオで考えてみましょう。

### 誰が？

クラウドデータ連携を担うのは誰でしょうか？真っ先に考えられるのは社内の情報システム担当です。情シス担当さんができるなら、システムの扱いに慣れていない事業部や外部に委託する選択肢は考慮しないでしょう。

### どこで？

社内へのクラウドデータのバックアップであれば、オンプレでできるならオンプレでやりたいでしょう。わざわざデータ連携処理をするモジュールを外部に置く必要はありません。おそらく社内にはWindows デスクトップやWindows Server で余っているマシンもあるでしょう。

### どうやって？

オンプレのWindows マシンでPowerShell Cmdlets でクラウド連携を組む場合、PowerShell Cmdlets 以外はすべて標準のWindows OS（デフォルトでPowerShell は入っている）があれば連携が可能です。データ連携に必要なものは、トリガーする機能、データを取ってくる機能、データを加工してマッピングする機能です。通常は別のETL ツールを入れてホスティングしたり、ETL ツールがJava ならJDK を入れたりが必要です。.NET などのアプリで行う場合には、やはりアプリを開発して、配布して稼働させる必要があります。PowerShell Cmdlets での連携の一番のメリットはPowerShell とCmdlets 以外に何もいらないことです。トリガーはWindows が、データ取得とマッピングなどの処理はPowerShell とCmdlets が行ってくれます。

そして、PowerShell を使ったデータ連携には、情報システム担当さんは精通している場合が多いです。

### つまり

信頼できる社内のリソースで、社内の環境で、標準Windows に入っているPowerShell 以外にはCmdlets ライブラリだけで、使い慣れた方法でクラウドデータ連携が組めて稼働させられるというすばらしいものです。

## Salesforce データをPowerShell Cmdlets でMySQL にレプリケーション

PowerShell でシンプルなスクリプトを記述し、Salesforce データをMySQL データベースにレプリケーションしてみましょう。

### Salesforce データの取得

* モジュールのインストール:

```
Install-Module SalesforceCmdlets
```

* Salesforce への接続:

```
$salesforce = Connect-Salesforce  -User $User -Password $Password -SecurityToken $SecurityToken
```

* 取得ターゲットのリソースの取得:

```
$data = Select-Salesforce -Connection $salesforce -Table "Account"
```

Invoke-Salesforce cmdlet を使って、SQL-92 クエリを使用することもできます:

```
$data = Invoke-Salesforce -Connection $salesforce -Query 'SELECT * FROM Account WHERE Name = @Name' -Params @{'@Name'='GenePoint'}
```


* 戻り値からカラム名のリストを保存します:

```
$columns = ($data | Get-Member -MemberType NoteProperty | Select-Object -Property Name).Name
```

### Salesforce データをMySQL データベースに格納

* モジュールのインストール:

```
Install-Module MySQLCmdlets
```

* MySQL DB に、MySQL Server 名、ユーザー、パスワード、レプリケーション先のデータベース名を指定して、接続します:

```
$mysql = Connect-MySQL -User $User -Password $Password -Database $Database -Server $Server -Port $Port
```

* Salesforce、保存された値、そしてAdd-MySQL Cmdlet を使って、MySQL にデータを1レコードずつ挿入します。この例では、MySQL 側のテーブルは、Salesforce のリソース（Account）と同じテーブル名を持っている必要があります:

```
$data | % {
$row = $_
$values = @()
$columns | % {
$col = $_
$values += $row.$($col)
}
Add-MySQL -Connection $mysql -Table "Account" -Columns $columns -Values $values
}
```

これで、Salesforce データをMySQL に複製できました。これで、分析、BI などでSalesforce データをMySQL から使うことができるようになります。

* 一度PowerShell でSalesforce とMySQL に接続したら、次からは1行のコマンドでレプリケーションを実施できます:

```
Select-Salesforce -Connection $salesforce -Table "Account" | % {
$row = $_
$values = @()
$columns | % {
$col = $_
$values += $row.$($col)
}
Add-MySQL -Connection $mysql -Table "Account" -Columns $columns -Values $values
}
```

このように簡単にPowerShell Cmdlets を使って、クラウドデータの操作がPowerShell からできました。Salesforce 以外にも200種類以上のPowerShell Cmdlets を提供しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116843/dd97adad-fd30-7716-c3fb-b15f5018bb23.png)