hook_update_N ()에 새 테이블을 만들어야합니까?


11

에서 새 테이블을 만들 때 hook_schema()해당 테이블도 추가해야 hook_update_N()합니까? 아니면 databae-updates가 자동으로 테이블을 추가하도록하는 몇 가지 트릭이나 놓친 것이 있습니까?

hook_update_N () 문서는 새 테이블을 도입하는 것에 대해 설명하지 않지만 다음과 같은 문서는hook_schema() 말합니다 :

이 후크에 의해 선언 된 테이블 은 모듈이 처음 활성화 될 때 자동으로 생성 되고 모듈이 제거 될 때 제거됩니다.

(하이라이트는 내 꺼야)

그렇다면, hook_update_N () 및 hook_schema ()에서 새 테이블에 대한 스키마 정의를 복제하지 않는 것이 가장 좋습니다. 다음과 같이 스키마를 간단히 참조하십시오.

 function hook_update_N(&$sandbox) {
   $schema = hook_schema();
   $name = "foo";
   $table = $schema["foo"];
   db_create_table($name, $table);
 }

작동하는 것처럼 보이지만 사용자가 업데이트를 실행하고 둘 이상의 hook_update_N ()을 실행하면 테이블을 다시 변경하면 실패합니다. 결국 첫 번째 hook_update_N은 이미 올바른 데이터베이스를 설치하고 두 번째 hook_update_M ()은 이미 최신 열을 추가 / 변경 / 변경하려고 시도합니다.

이것을 어떻게 처리합니까?


문서 는 drupal.org/node/150215 를 참조하십시오 . 따라서 기본적으로 모듈을 설치 한 후 새 테이블을 추가하는 것은 hook_update_N을 통하는 것이지만 새 사용자 또는 새로 설치하기 위해 테이블 ​​정의를 hook_schema에 추가 할 수도 있습니다. hook_update_N을 통해 현재 테이블을 업데이트하기 위해 테이블을 변경하면 hook_schema의 변경 사항도 병합합니다.
junedkazi

1
따라서 DRY 위반을 피할 수있는 방법이 없습니다. 동정.
berkes

내가 아는 것은 없습니다. 그러나 스키마 정의가있는 작은 함수를 작성하고 두 함수 모두에서 해당 정의를 호출 할 수 있습니다.
junedkazi

@berkes 추가 스키마를 반환하는 다른 함수를 정의하고 업데이트 및 설치 후크에서이를 참조 할 수 있습니다.
user1359

답변:


15

drupal.org에서 복사하여 붙여 넣기 만하면됩니다. hook_schema에 스키마 정의를 추가해야합니다.

/**
 * Create new database table {mytable2}.
 */
function mymodule_update_7101() {
  $schema['mytable2'] = array(
     // table definition array goes here
  );
  db_create_table('mytable2', $schema['mytable2']);
}

hook_schema ()에서 hook_update_N ()으로 테이블 정의를 복사하는 다른 방법이 없다는 것을 의미합니까? 다시 말해, DRY 위반을 피할 수있는 방법이 없다는 것입니다.
berkes

3
@berkes spot on ... 아직 잘 보지 못한 경우를 대비해 여기 에 왜 좋은 설명이 있는지
Clive

@Clive 멋진 예입니다. 전에 본 적이 없습니다. +1
junedkazi

@junedkazi 귀하의 의견에 제공 한 링크에 링크가 있습니다.;)
Clive

-2

hook_schema () 정의 대신 모듈 설치 중 동일한 것을 실행하기 위해 hook_install ()을 추가하면 mymodule_update_7101 ()이 후크와 함께 좋습니다.


/**
 * Implements hook_install().
 */
function mymodule_install() {
  // Change the update number accordingly for more updates.
  for ($i = 7101; $i < 7102; $i++) {
    $update_func = 'mymodule_update_' . $i;
    if (function_exists($update_func)) {
      $update_func();
    }
  }
}


지시 된대로 API를 사용하는 것이 Drupal의 실습보다 훨씬 좋습니다. hook_schema () 및 hook_update_N ()을 직접 사용하십시오. 내가하는 한 가지는 hook_update_N ()에서 모듈의 hook_schema 구현을 호출 한 다음 해당 db_ * 함수를 실행하는 것입니다.
mradcliffe

hook_install()간단한 사실을 위해 hook_update_N () 구현을 호출해서는 안됩니다 hook_install(). 처음으로 모듈을 설치하는 것이므로 업데이트 할 테이블이 없습니다. 또한 배치를 실행해야하는 업데이트에는 코드가 작동하지 않습니다.
kiamlaluno

이 코드 스 니펫은 스키마를 업데이트하고 배치 목적으로 만 사용하는 경우 유용합니다. 기존 라이브 시스템의 경우이를 사용할 수 없습니다.
Akhila V Nair
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.