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.0
para 7.x-1.1
e implementou o foo_update_7100
e ele funciona muito bem.
O problema é que eu cometi um erro por dentro foo_update_7100
e 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 all
mas drush updatedb -y
ainda 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_N
número?
-1
significa que o módulo não está instalado. Fique à vontade para postar isso como resposta, para que eu possa aceitar.Respostas:
Configurá-lo como 0 deve funcionar.
system_schema()
diz que o valor deve ser:fonte
-1
para aparecer um módulo que Drupal diz estar ativado?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 .
(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.)
fonte
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.
fonte
--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 passadomymodule_update_
seja o que for 9123667 .. :) @Eelke também tem uma boa descrição em sua resposta.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).
fonte