スキーマを作成するデータベースを指定するにはどうすればよいですか?


12

Drupal 7で複数のデータベースを使用する場合、異なるサーバー上の異なるデータベースにテーブルが作成されるように指定するにはどうすればよいですか?

デフォルトでは、モジュールをインストールすると、Drupalはすべてがhook_schema()デフォルトのデータベースにインストールされると想定します。別のデータベースにテーブルを作成するように指定する方法はありますか、または何らかの手動による回避策を使用できますか?


私の最初の考えは、APIレベルではこれができないということです。モジュールが特定のまれなデータベース構成に関連付けられているためです。これはサイト固有のモジュールですか?あなたの修正もサイト/データベース構成固有のものである必要があると思います。
レサリオン

回答:


4

公式のAPIはないと思います。一般的にこれを行うことはあまり意味がありません。

とはいえ、あなたがする必要があるのはhook_schemayourmodule_schema(基本的にあなたが望むような、yourmodule_schema_otherdb)とは異なる名前を付け、次にhook_install()でデータベースを切り替えてから、カスタムスキーマ定義を呼び出すことを除いてdrupal_install_schema()が行うことを複製することです関数を実行してから、データベースをデフォルトに戻します。

また、を実装することを忘れないでくださいhook_uninstall()

ただし、これを行う理由はわかりません。:)


目的(この場合)はシャーディングですが、これを行う理由はたくさんあります。この欠点を回避するのにどれだけの労力を費やすかを考えると、このために大量のCREATE TABLEステートメントを書くだけになると思います。
-mikl

あなたが適切にそれをしたい場合は、対応するhook_uninstall()も書く必要があります:)あなたが話している問題がわかりませんが、あなたがする必要があるのはhook_enableを実装することです.xも同様に)そしてdrupal_install_schema()の数行のコードをコピーして調整します。特に、テーブルを複数のデータベースに表示したい場合は、hook_schema()を使用してデフォルトのデータベースに設定し、hook_install()で他のデータベースにも表示できます。データベースを切り替える間にdrupal_install_schema($ yourmodule)を単純に呼び出すこともできます。
ベルディール

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();
}

そのフックを検索し、インストールおよびアンインストール時に起動するモジュールを取得するのは、それほど手間がかかりません。他のDBスキーマ構造のキーであることと
ジェレミーフランスの

@JeremyFrench、このセットアップでは、空のデータベースを事前に作成する必要がありますか?私はそう思っています。
-zkent

1

@ Елин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();
}

ここに要点があります。


-2

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プレフィックスを使用することができます


それはOPが既にいますが、これは広いけれどもシステムだろう
クライヴ

システム全体はどうなりますか?明確にしてください
GoodSp33d

1
これらのセマンティクスは($db_url$db_prefixグローバル設定としてDrupalの6のためにしていて、別のサーバーにアクセスしているときに(私の場合のように)、同じMySQLサーバ上の別のデータベースをいない使用している場合、ドット表記にのみ機能します。
mikl

@kantu OPは、特定のテーブルのデータベースを変更する方法を尋ねています。(編集する前の)元のソリューションでは、テーブルごとではなくシステム全体で変更が行われていました。
クライブ

2
前に述べたように、Drupal 7に$db_urlはグローバル$db_prefix変数は存在しないか、存在しますが、存在しても、問題は解決しません。
mikl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.