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' 可能是个好主意。
我正在构建一个 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' 可能是个好主意。