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 已经完成了它的工作,这两列应该在数据库中。
我对 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 已经完成了它的工作,这两列应该在数据库中。