目前我已经在drupal 7中使用安装模式创建了表。之后,使用hook_update_n()更改表以添加新列。
现在drupal_write_records()不起作用 那些由hook_update_n()。
创建的字段此致 拉吉。
答案 0 :(得分:2)
hook_schema 或 hook_update_N ?
Drupal提供了一种非常强大且结构化的方式来升级您的网站并进行DDIC更改。两个重要的钩子是hook_schema()提供了一种结构化的,独立于数据库的方法来定义表模式。安装新模块时,会自动调用hook_schema()(是的,这是Drupal 7中的情况,而在Drupal 6中则必须明确用于创建表)并创建表。
现在你的表已经创建并且正在使用模块,你决定在表中进行更改,让我们说你决定添加一个新字段。现在,这种变化将如何到达所有系统并无缝升级,以便依赖于此字段的模块/代码不会中断。
Drupal提供另一个名为hook_update_N()的钩子,其中N是一个数值,表示模式的版本,例如mymodule_update_1()用于第一次更改,mymodule_update_2()用于第二次更改,依此类推。回到我们的例子,假设你需要添加一个新字段,你需要按如下方式实现钩子
/**
* Implements hook_update_N().
*/
function mymodule_update_1() {
db_add_field('mytable', 'myfield', array(
'description' => 'My Status Field',
'type' => 'int',
'not null' => FALSE,
'unsigned' => FALSE,
));
}
完成此操作后,必须使用drush updb或url /update.php运行更新。运行更新后,Drupal会识别出架构中存在更新,因为从未运行过数字1(来自上面的示例)。它运行该函数并将模式的版本跟踪为1.因此,下次进行另一次更改并需要更新表模式时,您可以使用任何高于先前最大数字的数字,Drupal将应用该更改。
现在hook_update_N()的变化是否足够?答案是否,您需要更新相应表的hook_schema()。有两个原因 1.在此之后运行任何查询时,Drupal将不会在表模式定义中找到新字段,因此不会写入此字段,例如当使用drupal_write_record()时。 2.当模块安装在以前从未拥有此模块的新站点中时,Drupal将仅运行hook_schema()并且不会运行任何其他更新,因为它需要表模式 是最新的,并将架构版本存储为最高的hook_update_N()编号。只有在运行更新后才会应用此更改。
<强>结论强>
必须在hook_schemea()中更新适当的表模式。 接下来使用hook_update_N()执行数据库更新,其中N&gt;过去最大更新号码