【问题标题】:drupal 7 custom schema error datetimedrupal 7自定义模式错误日期时间
【发布时间】:2011-12-31 12:43:01
【问题描述】:

我有以下架构(从自定义模块中带有 schema module (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 with Suhosin-Patch MySQL客户端版本:mysqlnd 5.0.8-dev - 20102224 - $Revision: 308673 $

有人看到这里有什么问题吗?

【问题讨论】:

    标签: php mysql drupal drupal-7 drupal-schema


    【解决方案1】:

    认为您需要使用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,
    ),
    

    问题似乎源于 Drupal 7 中是否实际允许 DATETIME;请参阅this discussion 了解更多详细信息,我无法在此处填写:)

    【讨论】:

    • 这正是问题所在。我使用了您的第二个建议,但也添加了类型(否则我会收到未找到类型索引的通知),如下所示:'time_to_send' => array( 'description' => 'When the message should arrive at the user', 'type' => 'datetime', 'mysql_type' => 'DATETIME', 'not null' => TRUE, ), 谢谢!
    • @dschenk 您关于添加'type''mysql_type' 的想法是天才!似乎活动数据库层(即/includes/database/[db-name]/schema.inc)实际上在使用常规'type'之前首先查找本机数据库类型(例如mysql_type)。因此,添加 'type' 可以为 drupal_write_record() 等函数和其他检查字段类型(如 Entity API)的模块创建一个很好的后备方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多