web-dev-qa-db-ja.com

新しいテーブルをhook_update_N()で作成する必要がありますか?

hook_schema()で新しいテーブルを作成するとき、そのテーブルもhook_update_N()に追加する必要がありますか?または、databae-updatesが自動的にテーブルを追加するようにするためのいくつかのトリック、または私が見逃したものはありますか?

Hook_update_N()のドキュメントでは、新しいテーブルの導入について何も説明されていませんが、- hook_schema() のドキュメントでは、

このフックによって宣言されたテーブルは自動的に作成されますモジュールが最初に有効化されたとき、モジュールがアンインストールされたときに削除されます。

(ハイライトは私のものです)

そうである場合、hook_update_N()とhook_schema()の両方で新しいテーブルのスキーマ定義が重複しないようにする最善の方法。単にスキーマを次のように参照します。

 function hook_update_N(&$sandbox) {
   $schema = hook_schema();
   $name = "foo";
   $table = $schema["foo"];
   db_create_table($name, $table);
 }

機能しているようですが、ユーザーが更新を実行して2つ以上のhook_update_N()を実行すると、テーブルを再度変更すると失敗します。結局のところ、最初のhook_update_Nは既に正しいデータベースをインストールしており、2番目のhook_update_M()はすでに最新の列を追加/変更/変更しようとします。

これにどう対処しますか?

11
berkes

したがって、drupal.orgからのコピーペーストのみです。また、スキーマ定義をhook_schemaに追加する必要があります。

/**
 * Create new database table {mytable2}.
 */
function mymodule_update_7101() {
  $schema['mytable2'] = array(
     // table definition array goes here
  );
  db_create_table('mytable2', $schema['mytable2']);
}
15
junedkazi