で新しいテーブルを作成するとき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年
したがって、DRYに違反することを回避する方法はないようです。残念。
—
2012年
私が気づいていることは何もありません。しかし、スキーマ定義を持つ小さな関数を記述して、両方の関数でその定義を呼び出すことができます。
—
junedkazi 2012年
@berkes追加スキーマを返す別の関数を定義して、更新フックとインストールフックの両方でそれを参照できます。
—
user1359