#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. спасибо, что прояснили это, все сработало отлично.