2

使用 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);
4

1 回答 1

2

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

1-您始终需要保留生成的模式。

cake schema generate

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

cake schema create

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

cake schema create app {table_name}

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

cake schema update {#}

更新: 如果你想让它成为一个可以由 UI 运行的进程,你可以从控制器调用 shell。我会这样构造它:

  • 在代码中保留版本号(引导程序)使用户保持最新状态
  • 数据库中的版本比较版本以了解它们是否需要
  • upgrade 为每个需要升级的版本调用升级 shell

  • 对升级shell调用的每个升级版本都有一个任务

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

于 2012-09-05T15:25:43.163 回答