Потрібно створити нові таблиці в moll_update_N ()?


11

Коли ви створюєте нову таблицю в hook_schema(), чи слід її додавати і в таблицю hook_update_N()? Або є якийсь трюк, або я щось пропустив, щоб оновлення баз даних автоматично додавали таблиці?

Документація kuk_update_N () нічого не пояснює щодо введення нових таблиць, тоді як документаціяhook_schema() говорить:

Таблиці, задекларовані цим гаком, будуть автоматично створені під час першого ввімкнення модуля та видалені при видаленні модуля.

(Виділення моє)

І якщо так, то як найкраще уникнути дублювання визначень схеми для нової таблиці як у_up_update_N (), так і в___чхему (). Просто посилаючись на схему наступним чином:

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

Здається, це працює, але якщо знову змінити таблицю, не вдасться, якщо користувач запустить оновлення та отримає запуск двох або більше s_update_N () s. Зрештою: перший hol_update_N тоді вже встановить правильну базу даних, а другий_up_update_M () спробує додати / змінити / змінити стовпці, які вже були оновлені.

Як ви з цим справляєтесь?


Для отримання документації зверніться до drupal.org/node/150215 . Отже, в основному додавати нову таблицю після встановлення модуля можна за допомогою кріплення_update_N, але ви також додаєте визначення таблиці до куки_схеми для нових користувачів або нових установок. Отож підсумуйте це, якщо ви внесете будь-які зміни таблиці для оновлення поточних таблиць через kuk_update_N, але ви також об'єднаєте зміни в гачковій схемі.
junedkazi

1
Тож немає ніякого способу уникнути порушення DRY, схоже. Шкода.
berkes

нічого, що мені відомо. Але ви можете написати невелику функцію, яка має визначення схеми, і викликати це визначення в обох функціях.
junedkazi

@berkes Можна було б визначити іншу функцію, яка повертає додаткову схему і посилається на неї як в гачках оновлення, так і встановлення.
користувач1359

Відповіді:


15

Так що просто копіюємо пасту з drupal.org. Вам також потрібно додати визначення схеми до куки_schema.

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

Ви маєте на увазі, що немає іншого способу, а потім скопіювати визначення таблиці з kuk_schema () у kuk_update_N (). Іншими словами: що немає способу уникнути порушення DRY?
berkes

3
Місце @berkes на… є дуже хороше пояснення, чому це тут, якщо ви його ще не бачили
Clive

@Clive Це приголомшливий приклад. Ніколи цього не бачив. +1
junedkazi

@junedkazi Є посилання на нього за посиланням, яке ви вказали у своєму коментарі;)
Clive

-2

mymodule_update_7101 () добре, разом з цим гаком, якщо ми додамо гачку_install (), щоб виконати те саме, поки установка модуля замість визначення кука_schema () також працює для мене.


/**
 * 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();
    }
  }
}


Набагато кращою практикою Drupal є використання API за вказівкою. Використовуйте прямо гачку_schema () та гак_update_N () безпосередньо. Одне, що я роблю, - це викликати реалізацію мого модуля на зачіпку__схеми в кук_піддачу (), а потім запустити відповідні функції db_ *.
mradcliffe

hook_install()не слід викликати жодних реалізацій kuk_update_N (), просто факт: hook_install()це встановлення модуля вперше, а значить, немає таблиць для оновлення. Також ваш код не працює для оновлень, для виконання яких потрібна партія.
kiamlaluno

Цей фрагмент коду буде корисним, якщо ви оновлюєте схему і лише для розгортання. Для існуючої живої системи це неможливо використовувати.
Ахіла V Найр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.