如何指定应该在哪个数据库中创建我的架构?


12

在Drupal 7中使用多个数据库时,如何指定要在其他服务器上的其他数据库中创建表?

默认情况下,当您安装模块时,Drupal假定其中的所有内容hook_schema()都应安装在默认数据库中。有没有一种方法可以指定应在其他数据库上创建表,还是可以使用某种手动解决方法?


我最初的想法是您不能在API级别执行此操作。原因是您的模块将与特定且罕见的数据库配置相关联。我认为这是一个特定于站点的模块?我相信您的修复还需要特定于站点/数据库配置。
Letharion 2012年

Answers:


4

我认为没有官方的API;一般而言,这样做没有多大意义。

就是说,您所要做的就是给您hook_schema一个不同于yourmodule_schema(基本上是您想要的名称)的名称yourmodule_schema_otherdb,然后在hook_install()中,首先切换数据库,然后复制drupal_install_schema()的功能,只不过您调用自定义模式定义函数,然后将数据库切换回默认值。

另外,请记住实施hook_uninstall()

不过,不知道为什么要这么做。:)


目的(在这种情况下)是分片,但是我可以想到很多这样做的正当理由。考虑到解决该缺点将带来多大的麻烦,我想我最终只会为此写很多CREATE TABLE语句。
mikl 2012年

如果想要正确执行,还需要为其编写相应的hook_uninstall():)不确定我是否看到您正在谈论的麻烦,您需要做的就是实现hook_enable(在6中必须要做的) .x),并复制和调整drupal_install_schema()中的几行代码。特别是如果您希望表显示在多个数据库中,甚至可以使用hook_schema()将其保存在默认数据库中,而在hook_install()中也可以将其用于其他数据库。您甚至可以在切换数据库之间简单地调用drupal_install_schema($ yourmodule)。
伯迪尔2012年

11

我已经通过Berdir提供的信息实现了这一目标。我的代码如下:

<?php
function mymodule_schema_otherdb() {
  $schema['mytable'] = array(
    'description' => 'My table description',
    'fields' => array(
      'myfield' => array(
        'description' => 'My field description',
        'type' => 'serial',
        'size' => 'medium',
        'not null' => TRUE,
        'unsigned' => TRUE,
      ),
    ),
    'primary key' => array('myfield'),
  );
  return $schema;
}

function mymodule_install() {
  db_set_active('otherdb');
  $schema = mymodule_schema_otherdb();
  foreach ($schema as $name => $table) {
    db_create_table($name, $table);
  }
  db_set_active();
}

function mymodule_uninstall() {
  db_set_active('otherdb');
  $schema = mymodule_schema_otherdb();
  foreach ($schema as $name => $table) {
    db_drop_table($name);
  }
  db_set_active();
}

得到一个寻找该钩子并在安装和卸载时触发的模块并不需要太多工作。其他数据库是架构结构的关键
杰里米·法兰西

@JeremyFrench,此设置是否需要提前创建空数据库?我想是这样。
zkent 2015年

1

一个Drupal的8版本的* .install文件的代码通过@ЕлинЙ提供:

注意:数据库必须存在并在settings.php中指定。

<?php
function mymodule_schema_otherdb() {
  $schema['mytable'] = array(
    'description' => 'My table description',
    'fields' => array(
      'myfield' => array(
        'description' => 'My field description',
        'type' => 'serial',
        'size' => 'medium',
        'not null' => TRUE,
        'unsigned' => TRUE,
      ),
    ),
    'primary key' => array('myfield'),
  );
  return $schema;
}

/**
 * Implements hook_install().
 */
function mymodule_install() {
  \Drupal\Core\Database\Database::setActiveConnection('otherdb');
  $connection = \Drupal\Core\Database\Database::getConnection();

  $schema = mymodule_schema_shared();
  foreach ($schema as $name => $table) {
    $connection->schema()->createTable($name, $table);
  }

  \Drupal\Core\Database\Database::setActiveConnection();
}

/**
 * Implements hook_uninstall().
 */
function mymodule_uninstall() {
  \Drupal\Core\Database\Database::setActiveConnection('otherdb');
  $connection = \Drupal\Core\Database\Database::getConnection();

  $schema = mymodule_schema_shared();
  foreach ($schema as $name => $table) {
    $connection->schema()->dropTable($name);
  }

  \Drupal\Core\Database\Database::setActiveConnection();
}

这是要点


-2

在settings.php配置
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
hook_schema db_set_active('sec_db')现在将连接到你的另一个数据库,不知道这是建议还是不要尝试它需要您自担风险。 而且,您可以使用db_prefix从该辅助数据库查询。您可以在settings.php中使用db前缀


不过,那将是系统范围的,OP已可以做到
克莱夫(Clive)

系统范围是什么?请澄清
GoodSp33d 2012年

1
这些语义($db_url$db_prefix作为一个全球性的设置是为Drupal 6和点符号只能在同一MySQL服务器上使用不同的数据库,而不是当(如在我的情况),你所访问不同的服务器时的作品。
mikl

@kantu OP正在询问如何更改特定表的数据库。您的原始解决方案(在您进行编辑之前)将在整个系统范围内进行更改,而不是逐表进行更改。
克莱夫(Clive)

2
正如我之前提到的,Drupal 7中没有$db_url或没有全局$db_prefix变量,即使存在,也无法解决问题。
mikl 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.