Drupal 7で複数のデータベースを使用する場合、異なるサーバー上の異なるデータベースにテーブルが作成されるように指定するにはどうすればよいですか?
デフォルトでは、モジュールをインストールすると、Drupalはすべてがhook_schema()
デフォルトのデータベースにインストールされると想定します。別のデータベースにテーブルを作成するように指定する方法はありますか、または何らかの手動による回避策を使用できますか?
Drupal 7で複数のデータベースを使用する場合、異なるサーバー上の異なるデータベースにテーブルが作成されるように指定するにはどうすればよいですか?
デフォルトでは、モジュールをインストールすると、Drupalはすべてがhook_schema()
デフォルトのデータベースにインストールされると想定します。別のデータベースにテーブルを作成するように指定する方法はありますか、または何らかの手動による回避策を使用できますか?
回答:
公式の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();
}
@ Елинbyが提供する* .installファイルコードのDrupal 8バージョン:
注:データベースが存在し、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);
In hook_schema
db_set_active('sec_db')
が別のDBに接続するようになりました。これが推奨されるかどうかは、自分の責任で試してみてください。
また、db_prefixを使用して、このセカンダリDBからクエリを実行できます。settings.phpでdbプレフィックスを使用することができます
$db_url
、$db_prefix
グローバル設定としてDrupalの6のためにしていて、別のサーバーにアクセスしているときに(私の場合のように)、同じMySQLサーバ上の別のデータベースをいない使用している場合、ドット表記にのみ機能します。
$db_url
はグローバル$db_prefix
変数は存在しないか、存在しますが、存在しても、問題は解決しません。