모듈의 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 all있지만, drush updatedb -y아직도 날 "이 필요 없음 데이터베이스 업데이트"제공합니다.

단순히 hook_update_N숫자 를 증가시키는 대신 어떻게 해결할 수 있습니까?


1
-1 대신 0으로 설정하십시오.
Andy

감사. 효과가있었습니다. -1모듈이 설치되지 않았다는 것을 분명히 언급하는 열 설명을 보았을 것 입니다. 받아 들일 수 있도록 답변으로 게시하십시오.
cherouvim

답변:


14

0으로 설정하면 작동합니다. system_schema()값은 다음과 같아야합니다.

모듈이 설치되지 않은 경우 (테이블이 존재하지 않는 경우) -1; 0 또는 모듈을 처음 설치할 때 실행되었거나 존재했던 모듈 hook_update_N () 함수의 가장 큰 N


1
실제로 이것은 이것이 유일한 업데이트 후크 인 경우에만 작동합니다. 일반적으로 모든 업데이트 후크가 다시 실행됩니다. 다시 실행해야하는 업데이트 후크 수 아래의 값을 1로 설정하는 것이 더 안전합니다 (다음 번호의 후크도 실행 됨).
Eelke Blok

-1Drupal 활성화 한 모듈에 대해 표시 될 이유가 있습니까?
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

매우 간단하지만 항상 사용합니다. 데이터베이스 백업 재로드 스크립트와 결합하여 업데이트 기능을 작성할 때 헹구고 반복 할 수 있습니다.

희망적으로 당신에게 도움이됩니다. 행운을 빕니다.


대박! 드루팔 7 또는 드루팔 8?
이그나시오 세 구라 Postigo

1
지금 만 D7.
Dan Shumaker

좋은 것입니다. 나를 도와 주었다. 설명을 위해 내 hook_update_N이 mymodule_update_7000과 같으면 버전의 drush uroll 명령에 0을 넣을 수 있습니다. 맞습니까?
Austin

1
@Kamal 죄송합니다. 더 잘 문서화해야합니다. 현재 후크에 hook_update_N이 7300에 있으면 --module=mymodule --version=7299 sys 테이블을 설정하기 전에 uroll을 줄 것입니다. 따라서 다음 dbup에서 7300이 실행됩니다. 따라서 아니요, 마지막 두 자리 숫자를 제공하지 말고 mymodule_update_9123667이 될 수있는 정수를 입력하십시오.
Dan Shumaker

0

업데이트 후크를 다시 실행하려면 hook 의 시퀀스 번호 아래 schema_version을 1로 설정해야 합니다 .

기술적으로, 다시 실행하려는 후크 아래와 업데이트 후크 위에는 재실행 할 필요가 없습니다 (그러나 0 이상, -1은 모듈이 설치되지 않았 음을 의미 함). 다른 업데이트 후크가없는 경우 0도 해당 경계 사이에 속하지만 일반적으로 업데이트 후크는 1 씩 증가하므로 더 많은 코드를 실행하지 않으려면 1로만가는 것이 유일한 안전한 옵션입니다. 현재 가장 높은 업데이트 후크보다.

업데이트 프로세스는 단순히 해당 값을 확인하고 시퀀스 번호가 더 높은 업데이트 후크가 있는지 확인합니다. 그렇다면 순서대로 실행됩니다. (이것은 또한 설치 프로세스가 사용 가능한 가장 높은 업데이트 후크에 해당하는 스키마 버전을 설정한다는 것을 의미합니다. 설치시 모듈이 마지막 업데이트 후크에 해당하는 상태를 가정합니다).


0

여전히 답을 찾고있는 사람은 3 가지 방법으로이를 달성 할 수 있습니다.

  • SQL : UPDATE 시스템 SET schema_version = [N *] 이름 = '[모듈 이름]';

  • 돌진 : 돌진 ev "drupal_set_installed_schema_version ( '[모듈 이름]', [N *])"

  • Drush Uroll Drush Uroll --module = [모듈 이름] --version = N *

* N 되돌리려는 업데이트 기능 (예 : 마지막으로 성공한 업데이트 기능)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.