如何将MySQL数据库的结构转储添加到PHP中的变量?



我有两个从MySQL工作台生成的数据结构转储。现在我想添加它们或将它们包含在PHP脚本中,并将它们用作变量:

var $sourceStruct = ''; //structure dump of the reference database
var $destStruct = ''; //structure dump of database to update

我遵循这个脚本比较两个数据库并同步它们,但作者没有给出任何解释如何在这个脚本中包含转储?

用法:

var $sourceStruct = 'CREATE TABLE ...'; //add structure dump of the reference database here
var $destStruct = 'CREATE TABLE ...'; //add structure dump of database to update
$updater = new dbStructUpdater();
$updates = $updater->getUpdates($sourceStruct, $destStruct);

结果:

$updates == array (
[0]=>"ALTER TABLE `b` MODIFY `name` varchar(255) NOT NULL",
...
)

好吧,如果您只想将转储文件放入变量中,那么使用PHP内置的file_get_contents()函数读取文件,如下所示:

var $sourceStruct = file_get_contents('source_dump.sql') or die('Could not read source SQL dump!');
var $destStruct = file_get_contents('destination_dump.sql') or die('Could not read destination SQL dump!');
$updater = new dbStructUpdater();
$updates = $updater->getUpdates($sourceStruct, $destStruct);
foreach ($updates as $update) {
print $update . ';' . PHP_EOL;
}

这将生成更新目标数据库的所有SQL查询。

使用lib

的测试

Composer

提供的备选库在我这边,问题是我没有得到PHPClasses上的库,因为我不想创建一个帐户。所以我在谷歌上找到了这个相同的库在其他地方,我得到了它可以安装与Composer在这个地方:https://packagist.org/packages/eliasfarah/db-struct-sync

我创建了一个新文件夹,并在其中运行以下命令:

composer require eliasfarah/db-struct-sync

下载项目并创建以下内容:

  • composer.json
  • composer.lock
  • 供应商/
    • autoload.php<-通常包含的文件。>
    • 作曲家/
    • eliasfarah/
      • db-struct-sync/
        • composer.json
        • dbStruct.php<-要更正的文件。>
        • nbproject/
        • /
        • 测试
          • compareSql_1_left.sql
          • compareSql_1_right.sql
          • left_1.sql
          • right_1.sql
          • testCase.php
          • update_1.sql
          • viewClasses.sql
          • viewClassesSplit.php

如果你没有Composer

你可以从GitHub下载源代码:https://github.com/eliasfarah/dbStructSync

dbStruct.php的编辑

因为它不工作与我的PHP 7安装,我做了一些手动更改(不是一个好主意,如果我们想更新库,但它只是一个测试你的问题)。您可以创建一个补丁并将其添加到您自己的编写器中。Json,以便在安装后应用。

  1. 第1行短的开始标记应该被长标记替换:<?变成<?php

  2. 在第63行,类的构造函数应该重命名为:

    /**
    * Constructor
    * @access public
    */
    function dbStructUpdater()
    {
    $this->init();
    }
    

    就变成:

    /**
    * Constructor
    * @access public
    */
    function __construct()
    {
    $this->init();
    }
    

我的测试源代码

我没有任何MySQL转储,所以我使用了库本身提供的测试。

我想使用Composer的自动加载文件,就像我们通常做的那样,但它似乎不工作,可能是因为lib是旧的,不尊重常见的约定。所以我像这样直接包含PHP文件:

<?php
// Normal way to go not working :-(
//include 'vendor/autoload.php';
// Quick and dirty solution to have the class.
include 'vendor/eliasfarah/db-struct-sync/dbStruct.php';
$src = file_get_contents('vendor/eliasfarah/db-struct-sync/tests/left_1.sql');
$dest = file_get_contents('vendor/eliasfarah/db-struct-sync/tests/right_1.sql');
$updater = new dbStructUpdater();
$queries = $updater->getUpdates($src, $dest);
var_export($queries);

输出
array (
0 => 'ALTER TABLE `personalizer_config` MODIFY `cookyExpires` varchar(20) NOT NULL default '30'',
1 => 'ALTER TABLE `personalizer_config` ADD `cron_id` varchar(255) NOT NULL',
2 => 'ALTER TABLE `personalizer_config` MODIFY `enable_roles` tinyint(4) NOT NULL',
3 => 'ALTER TABLE `personalizer_config` MODIFY `group_table` varchar(255) NOT NULL default 'group'',
4 => 'ALTER TABLE `personalizer_config` MODIFY `ldapswitch` tinyint(4) NOT NULL',
5 => 'ALTER TABLE `personalizer_config` MODIFY `masterPassword` varchar(32) NOT NULL',
6 => 'ALTER TABLE `personalizer_config` MODIFY `relations_table` varchar(255) NOT NULL default 'relations'',
7 => 'ALTER TABLE `personalizer_config` MODIFY `std_group_tpl_none` varchar(255) NOT NULL',
8 => 'ALTER TABLE `personalizer_config` MODIFY `std_group_tpl_own` varchar(100) NOT NULL',
9 => 'ALTER TABLE `personalizer_config` MODIFY `std_group_tpl_sub` varchar(255) NOT NULL',
10 => 'ALTER TABLE `personalizer_config` MODIFY `stdCutOuts` varchar(255) NOT NULL',
11 => 'ALTER TABLE `personalizer_config` MODIFY `stdUserFields` varchar(255) NOT NULL',
12 => 'ALTER TABLE `personalizer_config` MODIFY `user_table` varchar(255) NOT NULL default 'user'',
)

最新更新