使用 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);
最佳答案
架构 shell 将为您管理所有差异。你真的不需要跳过任何不必要的障碍。您只需要担心两件事:
1-您始终需要保留生成的架构。
cake schema generate
这不仅用于保存您的基本架构,还用于保存您的快照。然后,您可以从中创建数据库。
cake schema create
这在设置新安装或在数据库中创建不存在的表时使用。这是破坏性的,会删除所有表并重新创建它们。如果你想创建一个缺失的表,你可以这样调用它:
cake schema create app {table_name}
2- 始终为您的模式创建快照。这将允许对现有数据库进行非破坏性升级。您可以像这样升级您的架构:
cake schema update {#}
更新: 如果您想使其成为可由 UI 运行的进程,您可以从 Controller 调用 shell。我会这样构造它:
- 在代码(Bootstrap)中保留版本号,让用户保持最新状态
- 数据库中的版本比较版本以确定是否需要
- upgrade 为每个需要升级的版本调用升级 shell
- 每个升级版本都有一个由升级调用的任务
外壳
这样,如果有人需要升级多个版本,它们都将在同一个升级过程中运行。
关于php - 获取两个架构快照的差异以更新 CakePHP 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12275901/