【PowerShell】PowerShellからMySQLのテーブルデータを取得してCSVファイルに保存するには

この記事では、PowerShellからMySQLのテーブルデータを取得してCSVファイルに保存する方法についてご説明します。

【動画】PowerShellからMySQLのテーブルデータを取得してCSVファイルに保存する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


まずPowerShellからMySQLを操作するための「MySql.Data.dll」を読み込みます。

そのあとに接続文字列を設定し、PowerShellからMySQLのデータベースに接続します。

接続したら、取得先のテーブルに対してSELECT文を実行してテーブルデータを取得しています。

今回は取得したデータをCSVファイルに保存しています。

コードの流れ

STEP.1
PowerShellからMySQLを操作するための「MySql.Data.dll」を読み込む
PowerShellからMySQLを操作するための「MySql.Data.dll」を読み込みます。
PowerShellからMySQLを操作するには「MySql.Data.dll」を読み込む必要があります。
STEP.2
接続文字列を設定する
接続文字列を設定します。
ここでは、MySQL接続先のサーバ名、データベース名、ユーザ名、パスワードを指定します。
STEP.3
SELECT文を設定する
SELECT文を設定します。
STEP.4
MySqlCommandオブジェクトを生成してMySQLのデータベースファイルに接続する
MySqlCommandオブジェクトを生成してMySQLのデータベースファイルに接続します。
STEP.5
SELECT文を実行する
SELECT文を実行します。
STEP.6
SELECT文を実行した結果をCSVファイルに保存する
SELECT文を実行した結果をCSVファイルに保存します。
STEP.7
MySQLのデータベースへの接続を閉じる
MySQLのデータベースへの接続を閉じます。

MySQLのデータベースとテーブルの例

今回は下のMySQLのデータベースとテーブルを用意しました。

MySQLのデータベースには「syain」のテーブルが存在しており、10件のデータが存在しています。

今回はこの10件のデータをCSVファイルに保存します。

生成したCSVファイルの中身は下のとおりです。

PowerShellのコード(例)

# PowerShellからMySQLを操作するための「MySql.Data.dll」のフルパスを取得する
$diiPath = "C:\Program Files (x86)\MySQL\MySQL Installer for Windows\MySql.Data.dll"

# 「MySql.Data.dll」を読み込む
[System.Reflection.Assembly]::LoadFile($diiPath) | Out-Null

# MySQL接続文字列を設定する
$server = "localhost"
$database = "testdb"
$user = "root"
$password = "testPass@123456"

# フォルダパスを設定する
$folderPath = "C:\work\10_勉強\18_PowerShell\0013\"

# 取得したデータを出力するCSVファイル名を設定する
$csvFileName = $folderPath + "data.csv"

# 接続文字列を設定する
$connectionString = "Server=$server;Database=$database;Uid=$user;Pwd=$password;"

# MySqlConnectionオブジェクトを生成する
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection($connectionString)

# SELECT文を設定する
$query = "SELECT * FROM syain"

# MySqlCommandオブジェクトを生成する
$command = New-Object MySql.Data.MySqlClient.MySqlCommand($query, $connection)

# データベースに接続する
$connection.Open()

# SELECT文を実行する
$reader = $command.ExecuteReader()

# 空の配列を用意する
$table = @()

# テーブルのフィールド名をすべて取得する
$columnNames = $reader.GetSchemaTable() | Select -Expand ColumnName

# 取得したデータの最終行まで処理を繰り返すwhileループ
while ($reader.Read()) {

    # 1行分のデータを格納するPSObjectインスタンスを生成し、rowに格納する
    $row = New-Object PSObject

    # フィールドの数だけ処理を繰り返すforeachループ
    foreach ($columnName in $columnNames) {

        # rowに行のデータを格納する
        $row | Add-Member -MemberType NoteProperty -Name $columnName -Value $reader[$columnName]
    }

    # tableにrowの値を追加で格納する
    $table += $row
}

# 表形式でtableの値を出力する
$table | Format-Table -AutoSize | Out-File $csvFileName

# データベースとの接続を閉じる
$connection.Close()

注目すべきコード①

最初に見て頂きたいのは2行目から5行目です。

# PowerShellからMySQLを操作するための「MySql.Data.dll」のフルパスを取得する
$diiPath = "C:\Program Files (x86)\MySQL\MySQL Installer for Windows\MySql.Data.dll"

# 「MySql.Data.dll」を読み込む
[System.Reflection.Assembly]::LoadFile($diiPath) | Out-Null

コードの説明

以上のコードは、PowerShellからMySQLを操作するための「MySql.Data.dll」を読み込むコードです。

「MySql.Data.dll」はPowerShellからMySQLを操作するのに必要なファイルで、PowerShellからMySQLへの接続やSQLクエリの実行などが可能になります。

「MySql.Data.dll」を読み込まないとMySQLへの操作ができないので、「MySql.Data.dll」の読み込みを忘れないようにしましょう。

「MySql.Data.dll」の読み込みはLoadFileメソッドの引数に「MySql.Data.dll」のフルパスを指定して実行します。

ちなみに、私のPCの環境では「C:\Program Files (x86)\MySQL\MySQL Installer for Windows」配下にある「MySql.Data.dll」を参照しています。

注目すべきコード②

次に見て頂きたいのは8行目から11行目です。

# MySQLの接続情報を設定する
$serverName = "(LocalDB)\MSSQLLocalDB"      # 接続するサーバ名
$databaseName = "CS_01"                     # 接続するデータベース名
$userId = "test_user"                       # ログインユーザ名
$password = "pass_str1"                     # ログインユーザのパスワード

コードの説明

以上のコードは、MySQLの接続情報を設定するコードです。

今回はMySQL接続で接続するので、接続先のサーバ名、データベース名、ユーザ名、パスワードをここで指定します。

【参考】MySQLへの接続情報

注目すべきコード②

次に見て頂きたいのは14行目から17行目です。

# フォルダパスを設定する
$folderPath = "C:\work\10_勉強\18_PowerShell\0013\"

# 取得したデータを出力するCSVファイル名を設定する
$csvFileName = $folderPath + "data.csv"

コードの説明

以上のコードは、取得したデータを出力するCSVファイル名を設定するコードです。

注目すべきコード③

次に見て頂きたいのは20行目から23行目です。

# 接続文字列を設定する
$connectionString = "Server=$server;Database=$database;Uid=$user;Pwd=$password;"

# MySqlConnectionオブジェクトを生成する
$connection = New-Object MySql.Data.MySqlClient.MySqlConnection($connectionString)

コードの説明

以上のコードは、接続文字列を作成してSqlConnectionオブジェクトを生成するコードです。

MySQLのデータベースに接続するための接続情報をconnectionオブジェクトに格納します。

このコードにより、どのMySQLのデータベースに接続するのか、PowerShellが認識できるようになります。

注目すべきコード④

次に見て頂きたいのは26行目から29行目です。

# SELECT文を設定する
$query = "SELECT * FROM syain"

# MySqlCommandオブジェクトを生成する
$command = New-Object MySql.Data.MySqlClient.MySqlCommand($query, $connection)

コードの説明

以上のコードは、SELECT文を取得し、そのSELECT文をMySqlCommandメソッドに渡してMySqlCommandオブジェクトを生成するコードです。

MySqlCommandオブジェクトを生成することで、SELECT文を実行することができるようになります。

注目すべきコード⑤

次に見て頂きたいのは32行目です。

# データベースに接続する
$connection.Open()

コードの説明

以上のコードは、PowerShellがデータベースに接続する処理のコードです。

注目すべきコード⑥

次に見て頂きたいのは35行目です。

# SELECT文を実行する
$reader = $command.ExecuteReader()

コードの説明

以上のコードは、SELECT文を実行する処理のコードです。

実行したSELECT文が抽出したデータはreaderに格納されます。

注目すべきコード⑦

次に見て頂きたいのは38行目です。

# 空の配列を用意する
$table = @()

コードの説明

以上のコードは、実行したSELECT文が抽出したデータを格納する配列を用意するコードです。

コンソールに出力する情報をすべて格納しておく「箱」をここで用意しておきます。

注目すべきコード⑧

次に見て頂きたいのは41行目です。

# テーブルのフィールド名をすべて取得する
$columnNames = $reader.GetSchemaTable() | Select -Expand ColumnName

コードの説明

以上のコードは、テーブルのフィールド名をすべて取得するコードです。

今回は「syain」のテーブルに対してSELECT文を実行しているので、「syain」テーブルにあるフィールド名をすべて取得し、columnNamesに格納しています。

「syain」のフィールド名は「id」「name」「address」「age」の4つのフィールドがあるので、この4つ全てのフィールド名がcolumnNamesに格納されます。

注目すべきコード⑨

次に見て頂きたいのは44行目です。

# 取得したデータの最終行まで処理を繰り返すwhileループ
while ($reader.Read()) {

コードの説明

以上のコードは、取得したデータの最終行まで処理を繰り返すwhile文です。

今回は10件あるテーブルデータを取得しているので10件目まで処理を繰り返します。

注目すべきコード⑩

次に見て頂きたいのは47行目から57行目です。

    # 1行分のデータを格納するPSObjectインスタンスを生成し、rowに格納する
    $row = New-Object PSObject

    # フィールドの数だけ処理を繰り返すforeachループ
    foreach ($columnName in $columnNames) {

        # rowに行のデータを格納する
        $row | Add-Member -MemberType NoteProperty -Name $columnName -Value $reader[$columnName]
    }

    # tableにrowの値を追加で格納する
    $table += $row

コードの説明

以上のコードは、取得したテーブルデータをtableに格納する処理のコードです。

取得したテーブルデータを1行ずつ取得し、tableに格納していきます。

コードの詳細

47行目のコードは、新しいPowerShellオブジェクトのPSObjectを生成し、rowという変数に格納します。

50行目のコードは、フィールドの数だけ処理を繰り返すforeachです。

「syain」のフィールドは「infoNo」「person」「score」の3つなので、3回処理を繰り返します。

53行目のコードでは、rowに行のデータを格納しています。

rowへの追加はAdd-Memberコマンドレットを実行します。

Add-Memberコマンドレットに「-MemberType NoteProperty」パラメータを指定することで、追加するメンバー(プロパティやメソッドなど)の種類を指定します。

「-MemberType NoteProperty」パラメータは値を格納するために指定します。

「-Name」パラメータにcolumnNameを指定し、「-Value」パラメータに$reader[$columnName]を指定します。

columnNameには現在のフィールド名が、$reader[$columnName]には現在の列の値が格納されています。

各行のデータが一つのPSObject(PowerShellオブジェクト)としてまとまり、そのプロパティとして各列のデータが格納されます。

57行目のコードは、tableにrowの値を追加で格納します。

注目すべきコード⑪

次に見て頂きたいのは61行目です。

# 表形式でtableの値を出力する
$table | Format-Table -AutoSize | Out-File $csvFileName

コードの説明

以上のコードは、表形式でtableの値をCSVファイルに保存するコードです。

Out-Fileコマンドレットを使うことで、このコマンドをCSVファイルに保存することができます。

Out-Fileコマンドレットの後にCSVファイルのフルパスを指定することで、そのCSVファイルにtableの値が保存されます。

保存されたCSVファイルは下のとおりです。

CSVファイルには出力せず、「$table | Format-Table -AutoSize」のコマンドをコンソール上で実行した結果は以下のとおりです。

注目すべきコード⑫

次に見て頂きたいのは64行目です。

# データベースとの接続を閉じる
$connection.Close()

コードの説明

以上のコードは、データベースとの接続を閉じる処理のコードです。

動作確認

MySQLのデータベースとテーブルの例」をご覧ください。

最後に

この記事では、PowerShellからMySQLのテーブルデータを取得してCSVファイルに保存する方法についてご説明しました。

PowerShellからMySQLのテーブルデータを取得してCSVファイルに保存したい場合は本記事を参考にして頂けたら幸いです。

プログラミングのスキルを習得するなら

プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。

プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。

→ TechAcademyの「1週間 無料体験」はこちら