テクセル

PowerShell で MariaDB を操作 (ODBC)


PowerShell から ODBC 経由で MariaDB を操作します。実行環境及び ODBCデータソースの設定は以下となります。
MariaDB Connector/ODBC のインストール、設定

ストレージエンジンは、Aria を使用しています。


# mariaODBC.ps1
# mariaDB ODBC接続

Set-StrictMode -Version latest

# ODBC データソースで接続する場合
$sCconStr = "DSN=mariadb;uid=root;pwd=root;"

# 接続文字列で接続する場合
# $sCconStr = "Driver={MariaDB ODBC 3.1 Driver};Database=test;USER=root;PASSWORD=root;"

$odbcCon = New-Object System.Data.Odbc.OdbcConnection($sCconStr)
try{
   $odbcCon.open()
}
catch{
   Write-Host "接続失敗"
   exit
}

$odbcCmd = New-Object System.Data.Odbc.OdbcCommand
$odbcCmd.Connection = $odbcCon

$odbcCmd.CommandText = "CREATE TABLE IF NOT EXISTS tbl0 (" +    # テーブル作成
   "id int," +
   "tda datetime," +
   "cnote char(20)," +
   "PRIMARY KEY (id)," +
   "KEY key1 (tda))" +
   "DEFAULT CHARACTER SET utf8," +
   "ENGINE=Aria PAGE_CHECKSUM=1 TRANSACTIONAL=1"
$rtn = $odbcCmd.ExecuteNonQuery()

$odbcCmd.CommandText = "SELECT max(id) FROM tbl0"
$odbcReader = $odbcCmd.ExecuteReader()
$id = 0
if ($odbcReader.Read() -eq $true){
   if ($odbcReader.IsDBNull(0) -ne $true){
      $id = $odbcReader.GetInt32(0)
   }
}
$id++

#Write-Host $id.ToString()

$odbcReader.Close()

$odbcCmd.CommandText = "INSERT INTO tbl0 VALUES (" +    # データ追加
   $id.ToString() + ",`'" +
   $(Get-Date).ToString("yyyy-MM-dd HH:mm:ss") + "`'," +
   "`'日本ニホン123abc`')"
$rtn = $odbcCmd.ExecuteNonQuery()

$odbcCmd.CommandText = "SELECT * FROM tbl0 ORDER BY id DESC LIMIT 5"
$odbcReader = $odbcCmd.ExecuteReader()

$ic = $odbcReader.FieldCount      # 列名表示
$sa = "列名:"
for($ia = 0; $ia -lt $ic; $ia++){
   $sa += $odbcReader.GetName($ia) + ","
}
Write-Host $sa

while($odbcReader.Read()){   # データ表示
   $sa = ""                  # $odbcReader[0]は、Int32型  $odbcReader[1]は、 DateTime型 $odbcReader[2]は、String型
   for($ix = 0; $ix -lt $ic; $ix++){
      $sa += $odbcReader[$ix].ToString() + ","
   }
   Write-Host $sa
}
$odbcReader.Close()

$odbcReader.Dispose()
$odbcCon.Close()
   

上記プログラム例での接続文字列は、データベースが動作しているパソコン上で接続する場合です。
別のパソコンから接続する場合の接続文字列例は以下となります。 Server(パソコン名または、IPアドレス)、Port(ポート番号)を指定します。
$sCconStr = "Driver={MariaDB ODBC 3.1 Driver};Server=192.168.1.99;Port=3306;Database=test;USER=****;PASSWORD=****;"

UPDATE、INSERT、DELETE ステートメントなどの行を返さないSQLの場合は、ExecuteNonQuery を使用します。 SELECT ステートメントなどの行を返すSQLの場合は、ExecuteReader を使用します。

SQLメモ

以下の例における変数 $odbcCon、$odbcCmd については、上記プログラム例を参照して下さい。

1) UPDATE

UPDATE テーブル名 SET カラム名1=値1, カラム名2=値2, ..... WHERE 条件式


#--- update 例
$odbcCmd.CommandText = "UPDATE tbl0 SET cnote = `'千葉県xyz890`' WHERE id = " + $id.ToString()
$rtn = $odbcCmd.ExecuteNonQuery()
   

2) DELETE

DELETE FROM テーブル名 WHERE 条件式


#--- delete 例
$odbcCmd.CommandText = "DELETE FROM tbl0 WHERE id = 10"
$rtn = $odbcCmd.ExecuteNonQuery()
   

3) DROP TABLE

テーブルを削除します。
DROP TABLE テーブル名


#-- drop table 例
$odbcCmd.CommandText = "DROP TABLE tbl0"
$rtn = $odbcCmd.ExecuteNonQuery()
   

4) SHOW TABLES (テーブル一覧)

SQL によりテーブル一覧を取得します。


#--- テーブル一覧
$odbcCmd.CommandText = "SHOW TABLES"
$odbcReader = $odbcCmd.ExecuteReader()
$sa = ""
while($odbcReader.Read()){
   $sa += $odbcReader[0].ToString() + ","
}
$odbcReader.Close()
Write-Host $sa
   

5) テーブル一覧

スキーマ情報によりテーブル一覧を取得します。


#--- テーブル一覧
$stbl = "テーブル一覧:"
[System.Data.DataTable]$dt = $odbcCon.GetSchema("Tables")
$ic = $dt.Rows.Count
for($ia = 0; $ia -lt $ic; $ia++){
   [System.Data.DataRow]$row = $dt.Rows[$ia]
   if ($row["TABLE_CAT"].ToString().Equals("test")){  # テータベースを指定
      $stbl += $row["TABLE_NAME"].ToString() + ","
   }
}
Write-Host $stbl
   

全テーブルの内容が取得されますので配列変数 $row の$row[0](TABLE_CAT) にセットされるデータベース名で選択を行います。
$row[0]:TABLE_CAT, $row[1]:TABLE_SCHEM, $row[2]:TABLE_NAME, $row[3]:REMARKS

PowerShellメモ
©2022-2024 TEXCELL CORPORATION
テクセル株式会社