hook_update_Nが実行されないのはなぜですか?


7

モジュールをDrupal 7に移植しています。モジュールにはhook_update_N()から呼び出される関数がありますhook_install()hook_update_N()関数の内部で作成されたいくつかの挿入クエリがあります。しかし、私のhook_update_N機能は実行されていません。hook_update_N関数を明示的に呼び出す方法はありますか?

私の質問はこれとほとんど同じであることを知っています。すべてのhook_update_N()を実行するためにhook_install()を取得する方法?。しかし、どうhook_update_N()呼ばれるのかわかりません。Drupalサイトで更新を実行しましたが、カスタムモジュールの更新も実行しているようhook_update_N()ですが、トリガーされていません。なぜなら、error_log()内部に関数を追加しましたhook_update_N()が、ログファイルが空だからです。

回答:


6

Drupalは、更新フックを1回だけ実行するため、実行された更新フックを格納します。特定の更新フックが実行されない場合、最も考えられる理由は

  • すでに実行されています
  • 失敗する前に実行する必要がある更新フック。

システムテーブルでは、有効になっているすべてのモジュールと、schema_version最後に実行された更新が表示されます。


ありがとうございました!!「システムテーブルを見る」というヒントは私を大いに助けてくれました。
subhojit777

他の理由を知っていますか?-1は特別な場合ですか?その重要性を知っていますか?
htoip 2017

10

更新フックが実行されないもう1つの理由は、更新フック名とモジュールのメジャーリリース番号の不一致です(.infoファイルを参照)。

たとえば、モジュールのバージョンが7.x.1.0の場合、更新フックmymodule_update_7001は実行されません。このような場合、フックの名前をmymodule_update_7101に変更する必要があります。

hook_update APIドキュメントを参照してください


1
これにより、不明な数のデバッグ時間を節約できました。ありがとう!
Pryo 2015

1
私にとっても、7100との1.x
ミスマッチでした。ありがとう

2

新しいモジュールをインストールするときに問題が発生しましたが、インストールが失敗しました。schema_versionは-1のままで、そのモジュールのそれ以上の更新ができなくなりました。バージョンを0に設定すると修正されました。

気になる方のために、既存のテーブルのスキーマを新しいモジュールに移動しました。この失敗は、既存のテーブルを作成できなかったときに発生しました。モジュールは期待どおりに有効化されましたが、schema_versionが更新されないことに気付きませんでした。


1
有効で機能しているカスタムモジュールのschema_versionが-1に設定されている場合にも、同様の問題が発生しました。私の知る限り、それは一度だけインストールされ、モジュールが今日使用されているため、インストールに失敗しませんでした。schema_versionが-1に設定された理由がわかりません。とにかく、schema_versionを手動で0に更新したので、以前にモジュールと共にインストールされた既存のテーブルに列を追加する必要があるときに、custom_update_7000が認識されて実行されます。
ウェズリーマスグローブ

1

hook_update_N()関数が何もしない理由の1つは、(hook_update_N()関数で使用した数と同じ)またはそれ以上の数の更新がすでに実行されていることです。

Drupal 7の「システム」テーブルにクエリを実行すると、モジュールに対して実行された最後の更新番号を確認できます。「schema_version」は、モジュールに適用された最後の更新のバージョン番号を格納する「システム」テーブルの列です。新しいhook_update_N()関数が機能するには、その関数で使用する数(N)が、そのモジュールの 'schema_version'列に現在格納されている数よりも大きい必要があります。

MySqlコマンドラインで次のクエリを使用しました(最初に 'use'コマンドを発行してDrupal 7データベース名を指定した後)。

mysql> select name、type、status、schema_version from system where type = 'module' and name = 'my_module_name';

「schema_version」列には番号が付けられます。新しい更新関数で使用する数は、それよりも大きくする必要があります。


1

私はこの問題を抱えていて、他の回答でそれが言及されているのを見ることができないので、山に追加すると思いました。

私の問題はDrupal 8.7にあり、モジュール名に大文字が含まれていて、更新のチェックに失敗することが問題でした。次に例を示しますmyModule

その理由はdrupal_get_schema_versions()、静的配列があり、その静的配列$updatesは、モジュール名をキーとする利用可能な更新スキーマバージョンの連想配列です。ただし、モジュール名はすべて小文字です。例えば$updates['mymodule']。これにより、ロジックが失敗して何も返されなくなり、Drupalは更新がないと考えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.