Moodle 中不存在自定义 table

custom table doesnt exist in Moodle

我正在构建一个 block moodle 插件。对于插件,我创建了三个表: 'block_learning_strategizer':仅包含一个字段标识 'ls_basic':包含3个字段-id,lp_name,description 'ls_path_details':包含9个字段。

定义是通过install.xml完成的(在blocks/learning_strategizer/db下) XML如下:

<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="blocks/learning_strategizer/db" VERSION="20120122" COMMENT="XMLDB file for Moodle blocks/learning_strategizer"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
>
    <TABLES>
        <TABLE NAME="block_learning_strategizer" COMMENT="Default for block_learning_strategizer" NEXT="ls_basic">
            <FIELDS>
                <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
            </FIELDS>
            <KEYS>
                <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
            </KEYS>
        </TABLE>

        <TABLE NAME="ls_basic" COMMENT="Table contains name and description of learning paths" NEXT="ls_path_details">
            <FIELDS>
                <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
                <FIELD NAME="lp_name" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" PREVIOUS="id" NEXT="description"/>
                <FIELD NAME="description" TYPE="text" NOTNULL="false" SEQUENCE="false" PREVIOUS="lp_name"/>
            </FIELDS>
            <KEYS>
                <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
            </KEYS>
        </TABLE>

        <TABLE NAME="ls_path_details" COMMENT="Table contains details of created learning paths" PREVIOUS="ls_basic">
            <FIELDS>
                <FIELD NAME="id" SEQUENCE="true" TYPE="int"  NOTNULL="true" LENGTH="10" NEXT="lp_id"/>
                <FIELD NAME="lp_id" SEQUENCE="false" TYPE="int" LENGTH="10" NOTNULL="true" NEXT="id" PREVIOUS="course" />
                <FIELD NAME="course" SEQUENCE="false" TYPE="int" LENGTH="10" NOTNULL="true" NEXT="section" PREVIOUS="lp_id"/>
                <FIELD NAME="section" SEQUENCE="false" TYPE="int" NOTNULL="true" LENGTH="10" NEXT="req" PREVIOUS="course"/>
                <FIELD NAME="req" SEQUENCE="false" TYPE="int" NOTNULL="true" LENGTH="2" NEXT="inc" PREVIOUS="section"/>
                <FIELD NAME="inc" SEQUENCE="false" TYPE="int" NOTNULL="true" LENGTH="2" NEXT="modid" PREVIOUS="req"/>
                <FIELD NAME="modid" SEQUENCE="false" TYPE="int" NOTNULL="true" LENGTH="3" NEXT="seqno" PREVIOUS="inc"/>
                <FIELD NAME="seqno" SEQUENCE="false" TYPE="int" NOTNULL="true" LENGTH="10" NEXT="filename" PREVIOUS="modid"/>
                <FIELD NAME="filename" SEQUENCE="false" TYPE="text" NOTNULL="true" LENGTH="255" PREVIOUS="seqno"/>
            </FIELDS>
            <KEYS>
                <KEY NAME="primary" TYPE="primary" FIELDS="id" NEXT="lp_id"/>
                <KEY NAME="lp_id" TYPE="foreign" FIELDS="lp_id" REFTABLE="ls_basic" REFFIELDS="id" PREVIOUS="primary" />
            </KEYS>
        </TABLE>
    </TABLES>
</XMLDB>

然而,当我尝试插入记录时出现错误:"Table "ls_basic“不存在” 我检查了站点管理中的 XMLDB 编辑器,我可以看到已经创建了表格。

我没有包含 upgrade.php 但据我所知该文件是可选的。 如果有人能指出我为什么会收到此错误,那将非常有帮助?

首次安装插件时,Moodle 会解析 install.xml 文件并使用它来创建插件所需的数据库 table。

第一次安装插件后,Moodle 不再查看 install.xml 文件。相反,它依赖于检查 upgrade.php 文件,在你的插件版本号(在 version.php 中)发生变化的地方,以找出如何转换以前的数据库结构以匹配新结构。

如果您的插件仍在本地开发中,您可以使用 'Plugins' 部分的 'uninstall' 功能让 Moodle 重新解析 install.xml 文件36=] 区域。这将删除插件的所有数据,然后,如果插件的代码仍然存在于服务器上,将立即提供重新安装插件(这将在 [=39= 中创建所有 tables ]).

如果您的插件已经在使用中,或者您不想丢失任何现有数据,那么您将需要使用 XMLDB 编辑器生成相关代码行以放入您的 upgrade.php 文件中(并增加您的插件版本号以匹配)。

有关详细信息,请参阅 https://docs.moodle.org/dev/Upgrade_API

我还建议现在是修复数据库 table 以符合 Moodle 编码指南的好时机:

  • 变量名称中不应包含 _ 个字符 - 这也适用于数据库字段名称(尽管数据库 table 名称中的 _ 是可以的)。
  • 插件数据库 tables 应该全部以插件名称开头(在本例中为 'block_learning_stategizer')——如果你最终使用 Travis CI 自动检查你的插件,然后它会抱怨你的数据库 table names.
  • 强烈建议不要在插件名称中包含 _(除了插件类型和名称的其余部分之间)- 多年来,由于 Moodle 核心卡住而导致许多错误在违反此规则的名称上。在遇到任何问题之前,现在重命名您的插件 'block_learningstrategizer' 可能是个好主意。