获取两个架构快照的差异,以便更新CakePHP应用程序

时间:2012-09-05 06:47:31

标签: php cakephp

使用CakePHP,我有两个快照。我希望得到两者的差异,然后使用该差异生成非破坏性的MySQL更新命令。

这是我到目前为止所做的,它返回一个alter table MySQL命令,但是,这不起作用,因为我需要先创建所述表。

    $this->Schema = new CakeSchema();
    $db = ConnectionManager::getDataSource($this->Schema->connection);
    $options = array();
    $Old = $this->Schema->read($options);
    $Schema = $this->Schema->load();
    $compare = $this->Schema->compare($Old, $Schema);
    $contents = array();

    if (empty($table)) {
        foreach ($compare as $table => $changes) {
            $update = $db->alterSchema(array($table => $changes), $table);
        }
    }
    $this->Installer->query($update);

1 个答案:

答案 0 :(得分:1)

架构shell将为您管理所有差异。你真的不需要跳过任何不必要的箍。你只需要担心两件事:

1-您始终需要保留生成的架构。

cake schema generate

这不仅用于保留基本架构,还用于保存快照。然后,您可以从此创建数据库。

cake schema create

在设置新安装或在数据库中创建不存在的表时使用。这是破坏性的,将删除所有表并重新创建它们。如果您想创建一个缺失的表,可以这样调用它:

cake schema create app {table_name}

2-始终制作架构的快照。这将允许对现有数据库进行非破坏性升级。您可以像这样升级架构:

cake schema update {#}

<强>更新 如果您想使这个过程可以由UI运行,您可以从控制器调用shell。我会这样构造它:

  • 在代码中保留版本号(Bootstrap)让用户保持最新状态
  • 数据库中的
  • 版本比较版本以了解是否需要
  • 升级为每个需要升级的版本调用升级shell
  • 为升级调用的每个升级版本都有一个任务 外壳

这样,如果有人需要升级多个版本,它们都将在同一升级过程中运行。