重置模块的hook_update_n状态


14

我正在扩展我之前编写的模块,它需要在中实现的一些模式更改hook_update_N

我已将模块的版本从7.x-1.0升级到7.x-1.1并实现,foo_update_7100并且效果很好。

问题是我在内部犯了一个错误foo_update_7100,现在我已经解决了这个问题,所以我无法重新运行7100更新。我需要创建一个7101,但是这没有任何意义,因为我的所有更改尚未提交。

我尝试通过以下方式重置hook_update_n的状态:

update system set schema_version=-1 where name='foo';

> Query OK, 1 row affected (0.01 sec)
> Rows matched: 1  Changed: 1  Warnings: 0

然后我做了,drush cc alldrush updatedb -y仍然给我“不需要数据库更新”。

我如何解决这个问题而不是简单地增加hook_update_N数字?


1
尝试将其设置为0而不是-1。
安迪

谢谢。那行得通。我应该已经看到了明确说明该列的说明,这-1意味着未安装该模块。随意发布它作为答案,以便我接受。
cherouvim 2012年

Answers:


14

将其设置为0应该起作用。system_schema()说的价值应该是:

-1(如果未安装模块)(其表不存在);0或模块首次安装时已运行或存在的模块hook_update_N()函数中最大的N个。


1
实际上,只有在这是唯一的更新钩子时,这才起作用。通常,这将导致所有更新挂钩再次运行。将值设置为需要重新运行的更新挂钩数以下的值更安全(所有带有后续编号的挂钩也将运行)。
Eelke Blok

是否有一个原因,-1会出现一个模块的Drupal说启用?
cdmo

6

仅供参考,在Drupal 8中,已删除系统表,并且此信息现在存储在key_value表中。

UPDATE key_value SET value='i:8000;' WHERE collection = 'system.schema' AND name = 'module_name';

(如上所述,实际值应小于要重复的hook_update_N(),但大于或匹配不需要重复的最后一次更新。)


3

我做了这么多事情,以至于我最终编写了一个drush模块来回退系统表中的更新版本。称为“ uroll”以进行更新回滚。

https://github.com/danshumaker/drush-uroll

用法:drush uroll --module = mycustommodule --version = 5

它非常简单,但我一直都在使用。该功能与数据库备份重新加载脚本结合在一起,使您可以在编写更新功能时进行冲洗和重复。

希望对您有所帮助。祝好运。


太棒了!Drupal 7或Drupal 8?
伊格纳西奥(Ignacio Segura)Postigo

1
仅限D7。
Dan Shumaker

它是一个好人。帮助过我。只是为了澄清我的hook_update_N是否类似于mymodule_update_7000,然后在您的drush uroll命令中输入版本号即可,我可以输入0。对吗?
奥斯汀

1
@Kamal对不起,我应该更好地记录下来。如果您正在编写的hook_update_N当前钩子位于7300,那么您将给uroll --module=mymodule --version=7299 将sys表设置在您的钩子之前。因此,在下一个dbup中,您的7300将运行。所以,不,不要只给它最后两位数字,而是要给它加上mymodule_update_9123667后面的整数。:) @Eelke的回答中也有很好的描述。
Dan Shumaker

0

要使更新挂钩再次运行,应将hook 的序列号下面的 schema_version设置为1

从技术上讲,您希望重新运行的钩子下方和不需要/想要重新运行的更新钩子上方的任何东西(但至少为0; -1表示未安装模块)都可以;如果没有其他更新挂钩,则意味着即使0也落在这些边界之间,但是在典型情况下,更新挂钩增加了1,因此如果您不想运行更多代码,则仅降低1是唯一安全的选择比当前最高的更新挂钩。

更新过程仅检查该值,并查看是否存在具有更高序号的更新挂钩。如果是这样,它将按顺序运行它们。(这也意味着安装过程会将模式版本设置为与最高可用更新挂钩相对应的版本;它假定在安装时,模块的状态将与最后一个更新挂钩相对应)。


0

对于仍在寻找答案的任何人,您可以通过3种方式实现这一目标:

  • SQL:UPDATE系统SET schema_version = [N *] WHERE名称='[模块名称]';

  • 催促:催促ev“ drupal_set_installed_schema_version('[模块名称]',[N *])”

  • Drush uroll drush uroll --module = [模块名称] --version = N *

* N是您要还原的更新功能(即上一次成功的更新功能)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.