我有两个从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
- db-struct-sync/
如果你没有Composer
你可以从GitHub下载源代码:https://github.com/eliasfarah/dbStructSync
对dbStruct.php的编辑
因为它不工作与我的PHP 7安装,我做了一些手动更改(不是一个好主意,如果我们想更新库,但它只是一个测试你的问题)。您可以创建一个补丁并将其添加到您自己的编写器中。Json,以便在安装后应用。
第1行短的开始标记应该被长标记替换:
<?
变成<?php
在第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'',
)