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


11

で新しいテーブルを作成するとき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()はすでに最新の列を追加/変更/変更しようとします。

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


ドキュメントについては、drupal.org / node / 150215を参照してください。したがって、基本的に、モジュールのインストール後に新しいテーブルを追加するには、hook_update_Nを使用しますが、新しいユーザーまたは新規インストールの場合は、hook_schemaにもテーブル定義を追加します。したがって、hook_update_Nを使用して現在のテーブルを更新するためにテーブルを変更した場合は、合計してください。また、hook_schemaの変更もマージします。
junedkazi 2012年

1
したがって、DRYに違反することを回避する方法はないようです。残念。
2012年

私が気づいていることは何もありません。しかし、スキーマ定義を持つ小さな関数を記述して、両方の関数でその定義を呼び出すことができます。
junedkazi 2012年

@berkes追加スキーマを返す別の関数を定義して、更新フックとインストールフックの両方でそれを参照できます。
user1359

回答:


15

したがって、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']);
}

テーブル定義をhook_schema()からhook_update_N()にコピーする方法は他にないということですか?つまり、DRY違反を回避する方法がないということですか。
2012年

3
@berkesスポット... まだ見たことがない場合に備えて、ここにある理由について非常に良い説明があります
クライヴ

@Cliveそれは素晴らしい例です。これまでに見たことがない。+1
junedkazi 2012年

@junedkaziコメントへのリンクにリンクがあります;)
クライブ

-2

mymodule_update_7101()は良好です。また、hook_schema()定義の代わりにモジュールのインストールも機能する一方で、hook_install()を追加して同じように実行すると、このフックも機能します。


/**
 * Implements hook_install().
 */
function mymodule_install() {
  // Change the update number accordingly for more updates.
  for ($i = 7101; $i < 7102; $i++) {
    $update_func = 'mymodule_update_' . $i;
    if (function_exists($update_func)) {
      $update_func();
    }
  }
}


指示どおりにAPIを使用することは、Drupalの慣習としてははるかに優れています。hook_schema()とhook_update_N()を直接使用してください。私が行うことの1つは、hook_update_N()でモジュールのhook_schema実装を呼び出してから、それぞれのdb_ *関数を実行することです。
mradcliffe 2016

hook_install()単純な事実として、hook_update_N()実装を呼び出さないでください。hook_install()モジュールを初めてインストールするためです。つまり、更新するテーブルがないということです。また、コードは、バッチを実行する必要がある更新では機能しません。
kiamlaluno

このコードスニペットは、スキーマを更新する場合にのみ、デプロイメント目的でのみ役立ちます。既存のライブシステムの場合、これは使用できません。
Akhila V Nair
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.