restablecer el estado de hook_update_n de un módulo

14

Estoy extendiendo un módulo que he escrito anteriormente y necesita algunos cambios de esquema que implemente hook_update_N.

He actualizado la versión del módulo de 7.x-1.0a 7.x-1.1e implementó el foo_update_7100y trabaja muy bien.

El problema es que he cometido un error por dentro foo_update_7100y ahora que lo he solucionado no puedo volver a ejecutar la actualización 7100. Necesito crear una 7101, pero eso no tiene sentido porque todavía no se han confirmado todos mis cambios.

Intenté restablecer el estado de hook_update_n a través de:

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

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

Luego lo hago drush cc allpero drush updatedb -yaún me da "No se requieren actualizaciones de la base de datos".

¿Cómo puedo resolver esto en lugar de simplemente incrementar el hook_update_Nnúmero?

cherouvim
fuente
1
Intente establecerlo en 0 en lugar de -1.
Andy
Gracias. Eso funciono. Debería haber visto la descripción de la columna que menciona claramente que -1significa que el módulo no está instalado. Siéntase libre de publicar eso como respuesta para que pueda aceptar.
cherouvim

Respuestas:

14

Establecerlo en 0 debería funcionar. system_schema()dice que el valor debería ser:

-1 si el módulo no está instalado (sus tablas no existen); 0 o el N más grande de la función hook_update_N () del módulo que se ejecutó o existió cuando se instaló el módulo por primera vez.

Andy
fuente
1
En realidad, esto solo funcionaría si este es el único enlace de actualización; normalmente, esto hará que todos los enlaces de actualización se ejecuten nuevamente. Es más seguro establecer el valor en 1 debajo del número del enlace de actualización que necesita volver a ejecutar (y también se ejecutará cualquier enlace con números posteriores).
Eelke Blok
¿Hay alguna razón para que -1aparezca un módulo que Drupal dice que está habilitado?
cdmo
6

Para su información, en Drupal 8, la tabla del sistema se ha eliminado, y esta información ahora se almacena en la tabla key_value .

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

(Como se señaló anteriormente, el valor real debe ser menor que el hook_update_N () que desea repetir, pero más alto o coincidir con la última actualización que no necesita repetirse).

micahw156
fuente
3

Hice esto tanto que terminé escribiendo un módulo drush para revertir la versión de actualización en la tabla del sistema. Llamado "uroll" para revertir la actualización.

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

Uso: drush uroll --module = mycustommodule --version = 5

Es súper simple pero lo uso todo el tiempo. Esto, combinado con un script de recarga de copia de seguridad de la base de datos, le permite enjuagar y repetir al escribir funciones de actualización.

Espero sea de ayuda para usted. Buena suerte.

Dan Shumaker
fuente
¡Increíble! Drupal 7 o Drupal 8?
Ignacio Segura Postigo
1
D7 solo por ahora.
Dan Shumaker
Es una buena. Me ayudó. Solo para aclarar si mi hook_update_N es como mymodule_update_7000, entonces en su comando drush uroll para la versión puedo poner 0. ¿Estoy en lo cierto?
Austin
1
@Kamal Lo siento, debería documentarlo mejor. Si el gancho actual que está escribiendo hook_update_N está en 7300, le daría uroll --module=mymodule --version=7299 que establece la tabla del sistema en una antes que la suya. Por lo tanto, en el siguiente dbup se ejecuta su 7300. Entonces, no, no solo le des los dos últimos dígitos, sino el número entero más allá de mymodule_update_lo que sea 9123667 .. :) @Eelke también tiene una buena descripción en su respuesta.
Dan Shumaker
0

Para que su enlace de actualización vuelva a ejecutarse, debe establecer la versión de esquema a 1 debajo del número de secuencia de su enlace .

Técnicamente, cualquier cosa debajo del enlace que desea volver a ejecutar y sobre el enlace de actualización no necesita / desea volver a ejecutar (pero al menos 0; -1 significa que el módulo no está instalado) está bien; si no hay otros enlaces de actualización, eso significa que incluso 0 cae entre esos límites, pero en el caso típico, los enlaces de actualización se incrementan en uno, por lo que solo bajar 1 es la única opción segura si no desea ejecutar más código que el actual gancho de actualización más alto.

El proceso de actualización simplemente verifica ese valor y ve si hay algún enlace de actualización con un número de secuencia más alto. Si es así, los ejecutará en secuencia. (Esto también significa que el proceso de instalación establece la versión del esquema en la correspondiente al enlace de actualización más alto disponible; se supone que después de la instalación, su módulo tendrá un estado correspondiente a ese último enlace de actualización).

Eelke Blok
fuente