clouddueling/auto-migrate

此类可用于生成 MySQL XML 备份文件与现有数据库之间的差异。它会告诉你缺失的表和列(以数组形式返回),或生成添加缺失列的 MySQL 查询。

0.0.1 2014-06-18 19:30 UTC

This package is not auto-updated.

Last update: 2024-09-24 02:31:52 UTC


README

该项目刚刚开始,但如果能证明它能大大节省时间,它将很快成熟。

此类可用于生成 MySQL XML 备份文件与现有数据库之间的差异。它会告诉你缺失的表和列(以数组形式返回),或生成添加缺失列的 MySQL 查询。

入门指南

  1. 通过 composer 安装

    {
        "require": {
            "clouddueling/auto-migrate": "dev-master"
        }
    }
  2. 将数据库导出为 XML 模式文件。

    sh src/Export/exportMySQL.sh <hostname> <username> <database> <output_dir>

    您的输出应如下所示

    Creating schema: series
    Creating schema: services
    Creating schema: sessions
    Creating schema: slides
    Creating schema: speakers
    Creating schema: states
    Creating schema: steps
    Creating schema: subscription
    

    输出的 XML 文件将用于管理数据库的外观。

  3. 当您修改模式文件时,然后使用 CloudDueling\AutoMigrate\MySQL 并遍历每个模式文件来更改您的数据库。

    可用方法示例

        $params = array(
            'dbuser' => 'root',
            'dbpass' => 'root',
            'dbname' => 'database',
            'dbhost' => 'localhost'
        );
    
        try {
            $diff = new MySQLDiff($params);
        } catch(Exception $e) {
            echo $e->getMessage(); exit;
        }
    
        // This returns an array of what's missing in the database
        try {
            $diff_lines = $diff->getDiffs();
            var_dump($diff_lines);
         catch(Exception $e) {
            echo $e->getMessage(); exit;
        }
    
        // This returns SQL queries which can be run to fix the database
        try {
            $diff_lines = $diff->getSQLDiffs();
            var_dump($diff_lines);
        } catch(Exception $e) {
            echo $e->getMessage(); exit;
        }
    
        // This generates the SQL and actually runs all of them
        try {
            $diff_lines = $diff->runSQLDiff();
            var_dump($diff_lines);
        } catch(Exception $e) {
            echo $e->getMessage(); exit;
        }

    示例:遍历模式文件目录并使用它们更新您的数据库。

    Laravel 4 任务

    // Coming soon, feel free to PR this

    Laravel 3 任务

    <?php
    
    class Schema_Task {
    
        public function update($arguments)
        {
            $params = array(
                'dbuser' => Config::get('database.connections.mysql.username'),
                'dbpass' => Config::get('database.connections.mysql.password'),
                'dbname' => Config::get('database.connections.mysql.database'),
                'dbhost' => Config::get('database.connections.mysql.host')
            );
    
            $files = scandir(Config::get('schemas.path'));
            $differences = 0;
    
            foreach ($files as $file) {
                if (in_array($file, ['.','..','.DS_Store'])) {
                    continue;
                }
    
                $params['dumpxml'] = Config::get('schemas.path') . '/' . $file;
    
                try {
                    $diff = new CloudDueling\AutoMigrate\MySQL($params);
                    $diff_lines = $diff->getSQLDiffs();
                    if (count($diff_lines) == 0) {
                        continue;
                    }
    
                    ++$differences;
    
                    echo "Difference found: {$params['dumpxml']}\n" .
                    " - " . implode("\n - ", $diff_lines) . "\n\n";
                    $diff->runSQLDiff();
                } catch(Exception $e) {
                    echo $e->getMessage() . "\n";
                    exit;
                }
            }
    
            echo "Differences found: {$differences}\n";
        }
    
    }

待办事项

  • 升级到 PDO!!!!(原始脚本依赖于 mysql_connect,可能是 Eloquent?)
  • 为 Laravel 3 和 4 创建示例 artisan 任务
  • 创建一个可以生成新表骨架 XML 文件的类
  • 支持表引擎从 MyISAM 更改为 InnoDB
  • 创建一个可以创建上下迁移的适配器
  • 添加到 Travis
  • 实现一个鼓励六边形结构的接口
  • 从连接参数中删除 'db'
  • 将深层嵌套的循环提取到更小的可理解类中。

目标

  • 允许未来数据库类型能够使用它们自己的类和导出脚本来使用此功能。
  • PSR 合规

贡献

请在讨论之前先创建一个包含您想法或错误的问题,以便没有人不必要地编写代码。

鸣谢

非常感谢最初编写此类的 Nabeel Shahzad。

许可证

MIT 许可证(MIT)。有关更多信息,请参阅许可证文件