对于数据库管理者来说,有时需要根据查询结果生成一系列非常相似但数量较多的sql命令,然后执行。为此,就需要将查询结果进行格式化,并输出到外部文件中。
对于select的查询结果,有个MySQL提供了直接的方法将查询结果写入到外部文件,其基本形式为
select * INTO OUTFILE 'file_name' from tab_list
我们还可以将查询结果进行一定的修饰,这要用到各种MySQL的内置函数,例如字符串函数和算数函数。
但是,有时我们的查询结果是用“show”命令得到的(例如show grants for 'user'@'host')时就不能使用上面的方法将查询结果输出到外部文件了。不过,根据MySQL说明书的提示,通过API访问MySQL的客户端程序,对于show命令返回的结果和select命令返回的结果都按相同的方式处理,因此我想到了通过PHP脚本来将一批show命令的结果写入外部文件。下面以一个具体问题来介绍我的处理方法。
在复制MySQL数据库时,如果希望将源MySQL Server的用户定义复制到目的Server时,就要获得每个定义用户的sql命令,然后执行这些sql命令,将命令产生的结果输出。下面是我写的 PHP脚本batch_sql_output.php,可以用php.exe直接在命令行执行php.exe batch_sql_output.php > output,将输出重定向的数据库外的文档
<?php
$sqlhost="localhost";
// $database="mysql";
$sqluser="admin";
$sqlpass="adminpass";
$mysql_link = @mysql_connect($sqlhost,$sqluser,$sqlpass) or die("Could not connect data-server: " . mysql_error());
// mysql_select_db($database, $mysql_link) or die ('Can\'t use database "'.$database.'" : '.mysql_error());
$preSql = "SELECT concat(\"SHOW GRANTS FOR '\",User,\"'@'\",Host,\"'\") as statement FROM mysql.user ORDER BY User,Host";
//die( $preSql);
$preResult = mysql_query($preSql) or print($preSql."\npreSql failed: " . mysql_error()."\n");
while ($preResultLine = mysql_fetch_array($preResult, MYSQL_ASSOC)) {
$result = mysql_query($preResultLine['statement']) or print($preResultLine['statement']."\nQuery failed: " . mysql_error()."\n");
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
foreach ($line as $col_value) {
echo $col_value."\n";
}
}
}
mysql_close($mysql_link);
?>