hook_schema не создает таблицу базы данных

12

Следующая функция содержится в process_login.install как часть пользовательского модуля с именем process_login. Модуль работает, если я вручную создал таблицу базы данных, но, естественно, я хотел бы, чтобы таблица создавалась автоматически при установке.

Сама функция не генерирует ошибку схемы при установке модуля. Но он также не создает таблицу базы данных process_login_register в базе данных MySQL Drupal 7.

Других ошибок, которые я вижу, или проблем, о которых сообщает Report Site, нет.

Я удалил это полностью и переустановил много раз. Я много искал в Интернете и ознакомился с двумя моими книгами по разработке Drupal. Я не вижу ничего плохого в этой функции (перечислены ниже).

ПРИМЕЧАНИЕ. Я также попытался определить «id» как последовательный, но получил тот же результат (т.е. таблица не была создана).

У меня кончились идеи. Кто-нибудь знает, почему эта функция не работает?

function process_login_schema(){
  $schema['process_login_register'] = array(
        'description' => 'Register a specific computer with the system.',
        'fields' => array(
                'id' => array(
                    'description' => 'Primary identifier.',
                    'type' => 'int',
                    'unsigned' => TRUE,
                    'size' => 'normal',
                    'not null' => TRUE,
                    'default' => 0,
                ),
                'ip' => array(
                        'description' => "The user's IP address at registration.",
                        'type' => 'varchar',
                        'length' => 32,
                        'not null' => TRUE,
                        'default' => '',
                ),
                'user_agent' => array(
                        'description' => "The user's browser user agent string at registration.",
                        'type' => 'varchar',
                        'length' => 255,
                        'not null' => TRUE,
                        'default' => '',
                ),
        ),
        'primary key' => array('id'),
  );
  return $schema;
}
user8109
источник
Какую версию Drupal вы используете?
googletorp
3
Вы фактически удалили и переустановили (а не просто отключили и повторно включили) модуль с момента написания этой функции?
Клайв
Drupal 6 требует вызова drupal_install_schema () в hook_install. В Drupal 7 рекомендуется не вызывать его явно.
Шоаиб Наваз
Ответы на выше: Drupal 7. Да. Я использую Drupal 7, поэтому не вызываю drupal_install_schema ().
user8109
1
@ user8109 Включение / отключение и установка / удаление - это две совершенно разные вещи в модулях. Включение модуля (проверка его на странице модулей и нажатие кнопки «Отправить») только активирует модуль и вызывает его hook_enable(). Установка модуля может быть выполнена только после его удаления (с помощью вкладки удаления или разработки / переустановки), после чего все таблицы, созданные модулем, будут удалены. Когда вы устанавливаете модуль, hook_install()он запускается так, как вы ожидаете
Clive

Ответы:

22

Используйте drush dre -y [module]который отключает, удаляет и затем повторно включает модуль. -yФлаг делает его еще быстрее, избегая вам нужно нажать у и ввести три раза.

bloke_zero
источник
16

Только если вы деинсталлируете модуль и впоследствии переустановите его, таблицы базы данных, которые он использует и объявляет с помощью hook_schema(), воссоздаются.

Чтобы удалить модуль, вам необходимо:

  • Снимите флажок, показанный для модуля

    снимок экрана

  • Нажмите на Сохранить конфигурацию

    снимок экрана

  • Нажмите на вкладку: Удалить_

  • Нажмите на флажок слева от названия модуля
  • Нажмите на кнопку Удалить

    снимок экрана

  • На следующей странице подтвердите, что вы хотите удалить этот модуль, нажав кнопку Удалить

    снимок экрана

В качестве альтернативы, если вы установили Drush, вы можете использовать следующие команды.

drush pm-disable $module
drush pm-install $module
drush en $module

Замените $moduleна короткое имя модуля между вершинами и без расширения .module.

Что вы сделали, это отключили модуль, а затем снова включили его. Даже если вы удалили каталог, содержащий модуль, для Drupal вы просто отключили, а затем снова включили его.

киамлалуно
источник
Можно ли это сделать с помощью drupal_install_schema и drupal_uninstall_schema .... drupal.org/node/876250
Hitesh