redefinindo o status hook_update_n de um módulo

14

Estou estendendo um módulo que escrevi anteriormente e ele precisa de algumas alterações de esquema nas quais implemento hook_update_N.

Eu atualizei a versão do módulo de 7.x-1.0para 7.x-1.1e implementou o foo_update_7100e ele funciona muito bem.

O problema é que eu cometi um erro por dentro foo_update_7100e agora que o corrigi, não consigo executar novamente a atualização 7100. Preciso criar um 7101, mas isso não faz sentido, porque todas as minhas alterações ainda não foram confirmadas.

Eu tentei redefinir o status do hook_update_n via:

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

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

Então eu faço, drush cc allmas drush updatedb -yainda me dá "Não são necessárias atualizações no banco de dados".

Como posso resolver isso em vez de simplesmente aumentar o hook_update_Nnúmero?

cherouvim
fonte
1
Tente configurá-lo para 0 em vez de -1.
Andy
Obrigado. Isso funcionou. Eu deveria ter visto a descrição da coluna que menciona claramente o que -1significa que o módulo não está instalado. Fique à vontade para postar isso como resposta, para que eu possa aceitar.
cherouvim

Respostas:

14

Configurá-lo como 0 deve funcionar. system_schema()diz que o valor deve ser:

-1 se o módulo não estiver instalado (suas tabelas não existem); 0 ou o maior N da função hook_update_N () do módulo que foi executada ou existia quando o módulo foi instalado pela primeira vez.

Andy
fonte
1
Na verdade, isso só funcionaria se esse fosse o único gancho de atualização; Normalmente, isso fará com que todos os ganchos de atualização sejam executados novamente. É mais seguro definir o valor como 1 abaixo do número do gancho de atualização que você precisa executar novamente (e quaisquer ganchos com números subsequentes também serão executados).
Eelke Blok
Existe alguma razão -1para aparecer um módulo que Drupal diz estar ativado?
Cdm 23/03/19
6

Para sua informação, no Drupal 8, a tabela do sistema foi removida e essas informações agora são armazenadas na tabela key_value .

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

(Como observado acima, o valor real deve ser menor que o hook_update_N () que você deseja repetir, mas maior ou igual à última atualização que não precisa ser repetida.)

micahw156
fonte
3

Fiz isso tanto que acabei escrevendo um módulo drush para reverter a versão de atualização na tabela do sistema. Chamado "uroll" para reversão de atualização.

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

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

É super simples, mas eu uso o tempo todo. Isso combinado com um script de recarga de backup do banco de dados permite enxaguar e repetir ao gravar funções de atualização.

Espero que seja útil para você. Boa sorte.

Dan Shumaker
fonte
Impressionante! Drupal 7 ou Drupal 8?
Ignacio Segura Postigo
1
D7 apenas por enquanto.
Dan Shumaker
É um bom. Me ajudou. Só para esclarecer se meu hook_update_N é como mymodule_update_7000, então no comando drush uroll da versão eu posso colocar 0. Estou certo?
Austin
1
@ Kamal Desculpe, eu deveria documentar melhor. Se o gancho atual que você está escrevendo hook_update_N for 7300, você forneceria uroll, --module=mymodule --version=7299 que define a tabela sys como uma antes da sua. Assim, no próximo dbup, seu 7300 será executado. Portanto, não, não apenas dê os dois últimos dígitos, mas o número inteiro passado mymodule_update_seja o que for 9123667 .. :) @Eelke também tem uma boa descrição em sua resposta.
Dan Shumaker
0

Para que seu gancho de atualização seja executado novamente, defina o schema_version como 1 abaixo do número de sequência do seu gancho .

Tecnicamente, qualquer coisa abaixo do gancho que você deseja executar novamente e acima do gancho de atualização que você não precisa / deseja executar novamente (mas pelo menos 0; -1 significa que o módulo não está instalado) está OK; se não houver outros ganchos de atualização, isso significa que até 0 cai entre esses limites, mas, no caso típico, os ganchos de atualização aumentam em um, portanto, apenas 1 mais baixo é a única opção segura, se você não deseja executar mais código do que o gancho de atualização mais alto atual.

O processo de atualização simplesmente verifica esse valor e verifica se existem ganchos de atualização com um número de sequência mais alto. Nesse caso, ele será executado em sequência. (Isso também significa que o processo de instalação define a versão do esquema como a que corresponde ao gancho de atualização mais alto disponível; assume que após a instalação, seu módulo terá um estado correspondente ao último gancho de atualização).

Eelke Blok
fonte