вызов базы данных MySQL / таблиц в powershell

#mysql #powershell

#mysql #powershell

Вопрос:

Я написал скрипт для подключения к моему серверу MySQL и у меня есть список всех баз данных на этом сервере и всех таблиц в каждой базе данных, и он отлично работает, в нем перечислены базы данных, затем в нем перечислены все таблицы вместе в одном столбце, я попытался сделать его более аккуратным, но, к сожалению, безуспешно, я бы хотел, чтобы в нем были перечислены таблицы как таковые:

 FirstDatabase:
FirstTable
SecondTable
ThirdTable....
SecondDatabase:
FirstTable
SecondTable
ThirdTable...
  

вместо этого он объединяет все таблицы вместе. Вот мой код:

     [void][System.Reflection.Assembly]::LoadWithPartialName("MySql.Data") 

$myconnection = New-Object MySql.Data.MySqlClient.MySqlConnection
$myconnection.ConnectionString = “server=MySqlServer;user id=$usr;password=$pwd;database=dbm;pooling=false”
$myconnection.Open()

$Query = "SELECT TABLE_SCHEMA FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('mysql','sys','information_schema','performance_schema') GROUP BY TABLE_SCHEMA;"
$Command = New-Object MySql.Data.MySqlClient.MySqlCommand($Query, $myconnection)
$DataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($Command)
$DataSet = New-Object System.Data.DataSet
$null = $DataAdapter.Fill($DataSet)
$results = $DataSet.Tables[0] 
$results

foreach ($result in $results) {

    $TableQuery = "USE "   $result.TABLE_SCHEMA   ";  SHOW TABLES;"
    $TableCommand = New-Object MySql.Data.MySqlClient.MySqlCommand($TableQuery, $myconnection)
    $TableDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($TableCommand)
    $TableDataSet = New-Object System.Data.DataSet
    $null = $TableDataAdapter.fill($TableDataSet)
    $TableResults = $TableDataSet.Tables[0]
}

$myconnection.Close()
  

запуск $results предоставляет базы данных на сервере.
запуск $TableResults дает таблицы во всех базах данных вместе

Я ценю любую помощь, спасибо.

Ответ №1:

Вместо вывода отдельных результатов на экран в виде строк, вы захотите создать объект для каждой таблицы с именами таблицы и базы данных в качестве свойств:

 # ...
$null = $DataAdapter.Fill($DataSet)
$results = $DataSet.Tables[0] 

# don't output anything yet!

$tables = foreach ($result in $results) {
    $TableQuery = "USE "   $result.TABLE_SCHEMA   ";  SHOW TABLES;"
    $TableCommand = New-Object MySql.Data.MySqlClient.MySqlCommand($TableQuery, $myconnection)
    $TableDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($TableCommand)
    $TableDataSet = New-Object System.Data.DataSet
    $null = $TableDataAdapter.fill($TableDataSet)
    $TableResults = $TableDataSet.Tables[0]
    foreach($tableRow in $TableResults){
        # Create a new object with both the database and table name
        [pscustomobject]@{
            Database  = $result.TABLE_SCHEMA
            TableName = $tableRow.Item(0)
        }
    }
}

$myconnection.Close()
  

Теперь, когда $tables содержатся объекты с обоими свойствами, вы можете использовать любой из них, чтобы изменить способ их форматирования PowerShell в выходных данных:

 PC C:> $tables |Format-Table TableName -GroupBy Database

   Database: db1

TableName
-----
Table1
Table2
Table3

   Database: db2

TableName
-----
Table1
Table2
Table3

   Database: db3

TableName
-----
Table1
Table2
Table3
  

Комментарии:

1. спасибо, что прояснили это, все сработало отлично.