drupal 7 пользовательская ошибка схемы datetime

У меня есть следующая схема (сгенерированная из существующей таблицы с модулем схемы (7.x-1.0-beta3) в пользовательском модуле.

function myproject_entities_schema() { // --------------------------------------------------------------------------------- // MESSAGE // --------------------------------------------------------------------------------- $schema['myproject_entity_message'] = array( 'description' => 'The base table for myproject message instances', 'fields' => array( 'id' => array( 'description' => 'The primary identifier for a message instance', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'weekendday' => array( 'description' => 'Whether this message gets send on a weekendday(1) or on a workday(0)', 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, 'default' => 0, ), 'day' => array( 'description' => 'Numbered day of campaign schedule', 'type' => 'int', 'not null' => TRUE, ), 'content' => array( 'description' => 'Message content', 'type' => 'text', 'not null' => TRUE, ), 'time_to_send' => array( 'description' => 'When the message should arrive at the user', 'type' => 'datetime', 'not null' => TRUE, ), 'campaign_fk' => array( 'description' => 'the foreign key of the campaign this message belongs to', 'type' => 'int', 'unsigned' => TRUE, 'not null' => FALSE, ), 'user_id' => array( 'description' => 'The user id this message is generated for', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'pool_id' => array( 'description' => 'The pool node id this message was generated from', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'message_template_id' => array( 'description' => 'The node id of the message template this message was generated from', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), ), 'primary key' => array('id'), 'indexes' => array( 'CAMPAIGN' => array('campaign_fk'), 'MESSAGE_TEMPLATE' => array('message_template_id'), 'POOL' => array('pool_id'), 'USER' => array('user_id'), ), ); // --------------------------------------------------------------------------------- // CAMPAIGN // --------------------------------------------------------------------------------- $schema['myproject_entity_campaign'] = array( 'description' => 'The base table for myproject campaigns instances', 'fields' => array( 'id' => array( 'description' => 'The primary identifier for a campaign instance', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'schedule' => array( 'description' => 'The schedule of the campaign in text format.', 'type' => 'text', 'not null' => TRUE, ), 'interruptible' => array( 'description' => 'Whether this campaign is interruptible or not', 'type' => 'int', 'size' => 'tiny', 'not null' => TRUE, ), 'campaign_template_id' => array( 'description' => 'Node id of campaign template this instance was created from', 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, ), 'product_fk' => array( 'description' => 'Primary key of product instance this campaign belongs to', 'type' => 'int', 'unsigned' => TRUE, 'not null' => FALSE, ), ), 'primary key' => array('id'), 'indexes' => array( 'CAMPAIGN_TEMPLATE' => array('campaign_template_id'), 'PRODUCT' => array('product_fk'), ), ); // --------------------------------------------------------------------------------- // PRODUCT // --------------------------------------------------------------------------------- $schema['myproject_entity_product'] = array( 'description' => 'The base table for myproject product instances', 'fields' => array( 'id' => array( 'description' => 'The primary identifier for a product instance', 'type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE, ), 'start' => array( 'description' => 'Time when the campaign started', 'type' => 'datetime', 'not null' => TRUE, ), 'current_campaign_fk' => array( 'description' => 'Foreign key of currently running campaign instance', 'type' => 'int', 'unsigned' => TRUE, 'not null' => FALSE, ), 'next_campaign_fk' => array( 'description' => 'Foreign key of campaign instance to run next', 'type' => 'int', 'unsigned' => TRUE, 'not null' => FALSE, ), ), 'primary key' => array('id'), 'indexes' => array( 'CURRENT' => array('current_campaign_fk'), 'NEXT' => array('next_campaign_fk'), ), ); return $schema; } 

Когда я пытаюсь установить модуль и таким образом создаю схему, я всегда получаю следующее уведомление (которое, как я считаю, не является основной причиной сбоя):

 Notice: Undefined index: datetime:normal in DatabaseSchema_mysql->processField() (line 200 of /Users/xxx/Repos/myproject/includes/database/mysql/schema.inc). 

И следующая ошибка:

 PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT NULL COMMENT 'When the message should arrive at the user', `campaign_fk` IN' at line 6: CREATE TABLE {myproject_entity_message} ( `id` INT unsigned NOT NULL auto_increment COMMENT 'The primary identifier for a message instance', `weekendday` TINYINT NOT NULL DEFAULT 0 COMMENT 'Whether this message gets send on a weekendday(1) or on a workday(0)', `day` INT NOT NULL COMMENT 'Numbered day of campaign schedule', `content` TEXT NOT NULL COMMENT 'Message content', `time_to_send` NOT NULL COMMENT 'When the message should arrive at the user', `campaign_fk` INT unsigned NULL DEFAULT NULL COMMENT 'the foreign key of the campaign this message belongs to', `user_id` INT unsigned NOT NULL COMMENT 'The user id this message is generated for', `pool_id` INT unsigned NOT NULL COMMENT 'The pool node id this message was generated from', `message_template_id` INT unsigned NOT NULL COMMENT 'The node id of the message template this message was generated from', PRIMARY KEY (`id`), INDEX `CAMPAIGN` (`campaign_fk`), INDEX `MESSAGE_TEMPLATE` (`message_template_id`), INDEX `POOL` (`pool_id`), INDEX `USER` (`user_id`) ) ENGINE = InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT 'The base table for myproject message instances'; Array ( ) in db_create_table() (line 2684 of /Users/xxx/Repos/myproject/includes/database/database.inc). 

Я искал ошибки в определении схемы, но не смог найти их. Также я не вижу, что именно не так с оператором sql.

Настройка моего сервера: Apache / 2.2.20 (Unix) mod_ssl / 2.2.20 OpenSSL / 0.9.8r DAV / 2 PHP / 5.3.6 с версией клиента Suhosin-Patch MySQL: mysqlnd 5.0.8-dev – 20102224 – $ Revision : 308673 $

Кто-нибудь видит, что здесь не так?

Я думаю, вам нужно использовать datetime:normal как ключ для вашего типа столбца datetime .

 'time_to_send' => array( 'description' => 'When the message should arrive at the user', 'type' => 'datetime:normal', 'not null' => TRUE, ), 

Помимо этого вы можете явно указать тип столбца как MySQL DATETIME :

 'time_to_send' => array( 'description' => 'When the message should arrive at the user', 'mysql_type' => 'DATETIME', 'not null' => TRUE, ), 

Проблема, похоже, связана с тем, действительно ли DATETIME разрешено в Drupal 7; см. эту дискуссию для получения более подробной информации, чем я могу поместиться здесь 🙂