Answers:
我认为没有官方的API;一般而言,这样做没有多大意义。
就是说,您所要做的就是给您hook_schema
一个不同于yourmodule_schema
(基本上是您想要的名称)的名称yourmodule_schema_otherdb
,然后在hook_install()中,首先切换数据库,然后复制drupal_install_schema()的功能,只不过您调用自定义模式定义函数,然后将数据库切换回默认值。
另外,请记住实施hook_uninstall()
。
不过,不知道为什么要这么做。:)
CREATE TABLE
语句。
我已经通过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();
}
一个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();
}
这是要点。
在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前缀
$db_url
,$db_prefix
作为一个全球性的设置是为Drupal 6和点符号只能在同一MySQL服务器上使用不同的数据库,而不是当(如在我的情况),你所访问不同的服务器时的作品。
$db_url
或没有全局$db_prefix
变量,即使存在,也无法解决问题。