【问题标题】:After using my new magento module: SQLSTATE[42S02]: Base table or view not found: 1146 Table XXX does使用我的新 magento 模块后: SQLSTATE[42S02]: Base table or view not found: 1146 Table XXX does
【发布时间】:2025-11-26 22:30:01
【问题描述】:

SQLSTATE[42S02]:未找到基表或视图:1146 表“desbest_full2.showdown_matches”不存在

但是为什么,如果我在 app/code/local/Desbest/Showdown/sql/Showdown_setup/mysql4-install-1.php 中有一个 mysql 设置脚本

<?php
echo 'Running This Upgrade: '.get_class($this)."\n <br /> \n"; die("Exit for now");

$installer = $this;
/* @var $installer Mage_Catalog_Model_Resource_Eav_Mysql4_Setup */
$installer->startSetup();
$installer->run("

    CREATE TABLE {$this->getTable('showdown_matches')} (
    --CREATE TABLE IF NOT EXISTS `showdown_matches` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `firstproductid` int(11) NOT NULL,
      `secondproductid` int(11) NOT NULL,
      `title` varchar(255) NOT NULL,
      `datenumber` varchar(10) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8_general_ci AUTO_INCREMENT=1 ;

    CREATE TABLE IF NOT EXISTS `showdown_votes` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `matchid` int(11) NOT NULL,
      `votedfor` varchar(10) NOT NULL,
      `ip` varchar(50) NOT NULL,
      `datenumber` varchar(10) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8_general_ci AUTO_INCREMENT=1 ;



");
$installer->endSetup();

该模块适用于我最初的 Magento 安装。

【问题讨论】:

  • 您好,您的 config.xml 是什么样的?
  • 注释行有效吗? --如果不存在则创建表showdown_matches。您是否曾经收到该错误消息,然后修复它,然后刷新页面(并且错误仍然存​​在?)。如果是这样,请查看您的网址,如果您正在访问 'local.com/errors/report.php?id=....' -> 这就是问题所在。那是一个静态页面。我发现您的代码没有任何问题(如果我没有遗漏任何内容)。
  • 我使用了注释行,但没有帮助。从我的角度来看,我的代码似乎也没有任何问题。很奇怪。
  • 安装脚本没有运行的原因是它不应该运行。请参阅 mjohnsonperl 答案,检查 Magento 跟踪已安装模块和版本的 core_resource 表。 SELECT * FROM core_resource` WHERE code LIKE '%showdown%'`

标签: magento


【解决方案1】:

您的安装脚本可能没有运行,因为 Magento 认为它已经运行。您可以检查数据库表 core_resource 以获取具有模块版本的模块记录。这个资源记录是 Magento 如何知道它是否已经运行了模块设置脚本,或者确定它是否需要从旧版本运行升级脚本到新版本。

如果您从 core_resource 表中删除模块的记录,Magento 将在下次 Magento 生成页面时尝试执行您的设置脚本。

我还希望您需要从设置脚本中删除die("Exit for now");,以便它实际到达创建表的部分。如果设置脚本启动并调用 die() 函数并结束该脚本的执行,我认为它可能会继续创建 core_resource 记录,表明它已完成设置脚本并且不会再次运行它,除非您从core_resource 表。

您可以在 Magento 知识库中找到有关设置脚本的一些信息: Magento for Developers: Part 6 - Magento Setup Resources

您还可以检查模块配置 XML 文件以确保其中的版本与安装脚本文件名的版本匹配。

<modules>
    <Desbest_Showdown>
        <version>1</version>
    </Desbest_Showdown>
</modules>
<global>
    <resources>
        <showdown_setup>
            <setup>
                <module>Desbest_Showdown</module>
            </setup>
        </showdown_setup>
    </resources>
</global>

我想到的另一件事是文件/目录名称区分大小写。如果您在 Mac 上设置了一堆不区分大小写的文件系统的东西,一切正常,然后将文件移动到文件系统区分大小写的 linux 机器上,您将遇到找不到文件的问题。您将文件名列为app/code/local/Desbest/Showdown/sql/Showdown_setup/mysql4-install-1.php,我认为目录Showdown_setup 可能需要全部小写showdown_setup

【讨论】:

  • 我同意区分大小写的说法。注意区分大小写的问题是一个好习惯。
  • 1.core_resource内部没有对决数据库行。 2. 它应该有die(),因为我正在制作插件,所以它在那里进行测试。根据个人经验,不,它不会使 core_resource 数据库行。 3. 我已将sql/Showdown_setup 重命名为sql/showdown_setup,但没有任何效果。 4.config.xml 中的版本号和mysql4-install-1.php 文件匹配。
  • 我现在已经弄清楚了问题所在。文件夹就是这种情况。我将Showdown_setup 更改为showdown_setup,现在它可以工作了!
【解决方案2】:

this question 中有用于调试非运行设置资源脚本的步骤。

【讨论】: