table 新添加的字段被完全忽略

Newly added field to table is completely ignored

我对 Drupal 完全陌生。不幸的是,我继承了一个非常丑陋和不正确的代码。事实上,我想实现一个正确的 login-with-facebook 功能,但完全错误地实现了。它试图通过他们的电子邮件地址来识别用户,但是,由于某种原因,在使用 Facebook 登录时,用户使用错误的用户登录。我想根据 Facebook ID 识别用户,但是,数据库中没有用于该目的的列。

因此,我实现了一个小脚本,它向代表用户的 table 添加了一个 facebook_id 和一个 facebook_token。但是,bootstrap.

中的 drupal_get_schema 函数看不到这些新列

如果我这样做:

$schema = drupal_get_schema("users");
echo var_dump($schema["fields"]);

显示除了新建的两个字段以外的字段。这样就初始化了一个 SchemaCache 对象。我假设模式可能被缓存。所以我尝试了一些不同的东西:

$schema = drupal_get_schema("users", true);
echo var_dump($schema["fields"]);

以确保 drupal_get_complete_schema(true) 将被调用。但是,也不会以这种方式看到字段。有没有办法告诉 Drupal 确认两个新创建的列的存在?如果不是:我该怎么办?我应该从数据库 table 中删除这两列并分别使用 db_add_field("users", "facebook_id") 和 db_add_field("users", "facebook_token") 吗?如果是这样,我应该在哪里调用这些?

如果问题太简单或者我误解了这些技术,我很抱歉,但我已经尝试解决这个问题好几个小时了,但我不知所措,因为这是我的第一个 drupal/bootstrap 项目和源代码-使用这些代码对我一点帮助都没有。

编辑:

因为在撰写本文时,除了没有解决我的问题的工具推荐之外,我还没有收到任何答案,因此我继续在该领域进行研究。我从数据库中删除了列,以 Drupal 方式创建它们。我已经在 user.module:

实现了这个功能
function user_schema_alter() {
      db_add_field('users', 'facebook_id', array(
                   'type' => 'varchar', //was initially a bigint, but Drupal generated a query which always crashed
                   'length' => 20,
                   'not null' => TRUE, 
                   'default' => ".", //was initially -1, but Drupal generated a query which always crashed
      ));
      db_add_field('users', 'facebook_token', array(
                   'type' => 'varchar', 
                   'length' => 300,
                   'not null' => TRUE, 
                   'default' => 'unavailable',
      ));
}

我从 altconnect.module 调用它,像这样:

    $schema = drupal_get_schema("users");
    if (!isset($schema["fields"]["facebook_id"])) {
        user_schema_alter();
    }

它创建了列,但稍后将不知道这些列的存在,随后将抛出错误,因为代码将尝试重新创建它们。除了我已经浪费了很多时间,直到我意识到 Drupal 无法支持将 -1 作为默认值的 bigint 字段,我不得不得出结论,通过这个解决方案,我完全相同和我最初的情况一样,不同之处在于使用这个 Drupal 解决方案,如果列已经存在,我总是会得到一个异常,因为模式不会知道它们,随后,代码将总是输入 if.

我不明白为什么这在 Drupal 中如此困难,我完全不明白为什么要尝试

  db_add_field('users', 'facebook_id', array(
               'type' => 'bigint', 
               'length' => 20,
               'not null' => TRUE, 
               'default' => -1,
  ));

由于语法错误引发异常。也许我应该离开这个项目并告诉任何考虑使用 Drupal 的人重新考虑:)

我找到了答案,至少对于 Drupal 6 是这样。

在user.install中我们需要做以下事情:

//...
function user_schema() {
    //...
    $schema['users'] = array(
        //...
        'fields' => array(
        //...
        'facebook_id' => array(
                   'type' => 'varchar', 
                   'length' => 20,
                   'not null' => TRUE, 
                   'default' => ".",
        ),
        'facebook_token' => array(
                   'type' => 'varchar', 
                   'length' => 300,
                   'not null' => TRUE, 
                   'default' => 'unavailable',
        ),
        //...
    ),
    //...
}

//...

/**
 * Adds two fields (the number is some kind of version number, should be the biggest so far for the module)
 */
function user_update_7919() {
      db_add_field('users', 'facebook_id', array(
                   'type' => 'varchar', 
                   'length' => 20,
                   'not null' => TRUE, 
                   'default' => ".",
      ));
      db_add_field('users', 'facebook_token', array(
                   'type' => 'varchar', 
                   'length' => 300,
                   'not null' => TRUE, 
                   'default' => 'unavailable',
      ));
}

完成后,使用管理员用户登录并转到http://example.com/update.php

在那里你会看到要更新的东西。 运行它。如果您想知道为什么我们必须做所有这些,为什么我们不直接 运行 一些脚本,那么答案就是这就是 Drupal 的运作方式。它通过使生活变得复杂来简化你的生活,但不要担心,当你等待 update.php 进行更新时,如果这是你的脚本,这将花费不到一秒钟的时间,你可以思考生命的意义,量子-力学,或者你可以尝试找出这在 Drupal 中过于复杂的原因,你可以出去走走。当你再次聚焦时,如果幸运的话,update.php 已经完成了它的工作,这两列应该在数据库中。