我已经看过一些关于此类的帖子,并且我自己也调查了 SQL 部署的相同场景。我不得不同意,作为企业级 Magento 应该内置这种类型的功能。好消息是,至少在 SOME 形式或时尚方面,我不太确定它有多完整。以下是异常回滚的示例:
try {
$write = Mage::getSingleton('core/resource')->getConnection('core_write');
$write->beginTransaction();
// do stuff here
$write->commit();
} catch (Exception $e) {
mage::log(__METHOD__ . ':' . __LINE__ . ': Rollback happened.');
$write->rollback();
}
现在,如果您查看 app/code/core/Mage/Core/Model/Resource/Setup.php,您会发现很多有趣的方法。特别是:_getModifySqlFiles、_rollbackResourceDb 和 _modifyResourceDb。
_modifyResourceDb 对我来说是最有趣的,因为这里的 $actionType 也可以是回滚和卸载 - 另请注意,您也可以将 PHP 文件用于安装文件。
// Read resource files
$arrAvailableFiles = array();
$sqlDir = dir($sqlFilesDir);
while (false !== ($sqlFile = $sqlDir->read())) {
$matches = array();
if (preg_match('#^'.$resModel.'-'.$actionType.'-(.*)\.(sql|php)$#i', $sqlFile, $matches)) {
$arrAvailableFiles[$matches[1]] = $sqlFile;
}
}
这段代码执行后:
$arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles);
但这里我假设核心 Magento 开发人员迷失在 EAV 资源模型的内部,只是让它部分完成。
protected function _getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrFiles)
{
$arrRes = array();
switch ($actionType) {
case 'install':
case 'data-install':
...
case 'rollback':
break;
case 'uninstall':
break;
}
return $arrRes;
}
我还没有机会真正测试上述内容,但仅根据我对 magento 和自动加载的 ORM 的初步调查以及另一位开发人员对他的发现的投入。
最终,如果我们可以将所有更改至少以模块方式保留在版本控制系统中,那将是理想的选择。显然,不应该以这种方式管理需要导入的庞大数据集,但对于这些小的增量更改,我想推动暂存、生产测试,如果失败将其拉回一个版本,一切都会恢复正常。
显然,对于这么多具有不同要求和需求的客户的部署,没有一个理想的解决方案,但这样做的一般方法将有助于代码/SQL 部署。具有讽刺意味的是,Enterprise 拥有 CMS 登台,以及代码模块化开发的能力,但 DB 却没有得到那么多的喜爱。
有一个相关的问题是指出我们目前如何使用一些“自制”的专门脚本来做这件事:
执行 MySQLDump 或备份,然后对 SQL 文件中的 BASE_URL 执行替换。
Best practices for Magento Deployment
另一个要查看的工具是Phing。
如果有人有时间调查似乎正在实施的“回滚”和“卸载”过程并报告他们的发现也会对我有所帮助。