Установочный файл модуля Drupal 6 не создает таблицы в базе данных - PullRequest
4 голосов
/ 16 августа 2010

Я использую API схемы для создания таблиц для моего модуля на Drupa 6.17, но таблицы просто не создаются в базе данных. У меня установлен модуль Schema, и он говорит мне, что хотя схема для моего модуля распознана, его таблицы нет в базе данных. Подходит под Missing:

Tables in the schema that are not present in the database.
test
* test_table

Вот содержимое моего файла test.install.

<?php
// $Id$
function test_schema() {
$schema['test_table'] = array(
    'description' => t('Test table'),
    'fields' => array(
        'nid' => array(
            'description' => t('test field'),
            'type' => 'serial',
            'not null' => TRUE,
        ),
        'options' => array(
            'description' => t('other test field'),
            'type' => 'text',
            'not null' => FALSE,
        ),
    ),
    'primary key' => array('nid'),
    );
    return $schema;
}
function test_install() {
    drupal_install_schema('test');
}
function test_uninstall() {
    drupal_uninstall_schema('test');
}

Ответы [ 4 ]

10 голосов
/ 30 марта 2011

Если вы хотите добавить установку модуля после создания модуля, вам нужно удалить запись из системной таблицы в вашей базе данных drupal, а затем включить ее снова.

отключите ваш модуль и сохраните

зайдите в системную таблицу и найдите там свой модуль

удалить эту запись

включить ваш модуль и сохранить

4 голосов
/ 16 августа 2010

Редактировать:

Вот код, который я только что написал, который работает.Следуйте примеру:

/**
 * Implementation of hook_schema().
 */

function action_alert_schema() {
 $schema['action_alert'] = array(
    'description' => 'Action Alert table.',
    'fields' => array(
   'aid' => array(
        'description' => 'The serial ID.',
        'type' => 'serial',
        'unsigned' => TRUE,
        'not null' => TRUE,
   ),
      'nid' => array(
        'description' => 'The primary identifier of the node.',
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
   ),
      'uuid' => array(
        'description' => 'The session id of the user if the UID is not present.',
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '0',
      ),
   ),
    'primary key' => array('aid'),
  );

return $schema;

}

/**
 * Implementation of hook_install().
 */
function action_alert_install() {
  drupal_install_schema('action_alert');
}

/**
 * Implementation of hook_uninstall().
 */
function action_alert_uninstall() {
 drupal_uninstall_schema('action_alert');
}
3 голосов
/ 17 августа 2010

Drupal запускает hook_install () модуля только один раз при первом включении модуля.Если вы не пройдете и не отключите, не удалите, а затем снова включите модуль, то будет вызван метод hook_install () вашего модуля.

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

1 голос
/ 23 января 2012

Я хотел бы поделиться с вами своим опытом с этой ошибкой в ​​Drupal 6. В моем первом модуле у меня было три таблицы.У меня была запись для каждого в моем hook_schema (называемом education_schema):

function education_schema()
{
  $schema['education_course'] = array( /* ... */ );
  $schema['education_market'] = array( /* ... */ );
  $schema['education_event'] = array( /* ... */ );
}

В моем hook_install у меня изначально было следующее:

function education_install()
{
  drupal_install_schema('education_course');
  drupal_install_schema('education_market');
  drupal_install_schema('education_event');
}

Нет таблицсоздавали при установке модуля.Зачем?Я понятия не имел: никаких ошибок не было видно нигде в журналах.В конце концов я узнал о PHP-расширении xdebug , которое при использовании в education_install показало, что drupal_install_schema не удалось, потому что не удалось найти подпрограммы education_course_schema, education_course_market и education_course_event.На тот момент решение было совершенно очевидным:

function education_install()
{
  drupal_install_schema('education');
}

И вуаля, это сработало!

Итак, я узнал, что drupal_install_schema не регистрирует никаких ошибок при сбое, что только однатребуется вызов drupal_install_schema, и он устанавливает все схемы, которые вы возвращаете в массив, что стоит прочитать документацию по API drupal_install_schema, и, наконец, xdebug - очень удобная утилита!

...