自@erfan saif以来,magento从1.6开始获得了多rdbms支持。但是在现实世界中,我只知道mysql后端。
重要的是要了解,magento可以针对不同的后端具有不同的安装/升级/数据脚本。如果要使用mysql支持但不支持标准SQL的特殊索引类型,则可以实现mysql4-install-1.0.0.php脚本。如果您的脚本是通用脚本,请使用install-1.0.0.php
如果看一下Mage_Core_Model_Resource_Setup,我会发现两个有趣的事情:
- 您可以命名文件(%s-)%s-VERSION。(php | sql)
- 如果您有两个安装脚本(但使用数据脚本,则是相同的(app / code / core / Mage / Core / Model / Resource / Setup.php:520))magento比通用脚本更喜欢专用脚本(作为一个)会)
应用程序/代码/核心/法师/核心/模型/资源/Setup.php:488
$regExpDb = sprintf('#^%s-(.*)\.(php|sql)$#i', $actionType);
$regExpType = sprintf('#^%s-%s-(.*)\.(php|sql)$#i', $resModel, $actionType);
while (false !== ($file = $handlerDir->read())) {
$matches = array();
if (preg_match($regExpDb, $file, $matches)) {
$dbFiles[$matches[1]] = $filesDir . DS . $file;
} else if (preg_match($regExpType, $file, $matches)) {
$typeFiles[$matches[1]] = $filesDir . DS . $file;
}
}
[...]
foreach ($typeFiles as $version => $file) {
$dbFiles[$version] = $file;
}
请注意,如果您命名脚本.sql
,则会直接将其调用到数据库中:
// app/code/core/Mage/Core/Model/Resource/Setup.php:621
switch ($fileType) {
case 'php':
$conn = $this->getConnection();
$result = include $fileName;
break;
case 'sql':
$sql = file_get_contents($fileName);
if (!empty($sql)) {
$result = $this->run($sql);
另外,当我的安装脚本未运行时该怎么办才能找出原因呢?
我更喜欢在安装/升级文件的开头添加die('sadf'),因为如果调用它,则可以多次运行它,因此在更改任何内容之前,我可以检查一下我设置的所有变量是否正确。数据库。如果我在屏幕上看到“ sadf”,我知道脚本正在运行。
我magento加载(而不是sadf),是时候进行调试了,我的两个标准错误是:
- 我忘记将脚本添加到配置中
- 我有
sql/
忘记的目录,例如sql/install-1.0.0.php
而不是sql/my_module_setup/install-1.0.0.php
并且因为我认为它适合此处,所以请谨慎使用变量名:http : //blog.fabian-blechschmidt.de/articles/file-kills-setup-script.html
UPDATE
@ rouven-rieker通过Twitter添加,在magento 1.6中添加了数据和缺少的mysql4-。如果需要向后兼容,请小心!