以前に作成したモジュールを拡張していて、hook_update_N
で実装するいくつかのスキーマ変更が必要です。
モジュールのバージョンを7.x-1.0
から7.x-1.1
に更新し、foo_update_7100
を実装したところ、問題なく動作しました。
問題は、foo_update_7100
の内部で誤りを犯したことと、それを修正したので、7100アップデートを再実行できないことです。 7101を作成する必要がありますが、すべての変更がまだコミットされていないため、これは意味がありません。
私はhook_update_nのステータスをリセットしてみました:
update system set schema_version=-1 where name='foo';
> Query OK, 1 row affected (0.01 sec)
> Rows matched: 1 Changed: 1 Warnings: 0
次にdrush cc all
を実行しますが、drush updatedb -y
を実行しても「データベースの更新は不要」と表示されます。
hook_update_N
番号を単純にインクリメントする代わりに、これをどのように解決できますか?
これを0に設定すると機能するはずです。 system_schema()
は、値は次のようにする必要があると言います:
-1モジュールがインストールされていない場合(そのテーブルが存在しない場合)。 0、またはモジュールが最初にインストールされたときに実行されたか存在していた、モジュールのhook_update_N()関数の最大N。
参考までに、Drupal 8の場合、システムテーブルは削除され、この情報はkey_valueテーブルに保存されます。
UPDATE key_value SET value='i:8000;' WHERE collection = 'system.schema' AND name = 'module_name';
(上記のように、実際の値は、繰り返したいhook_update_N()より小さくする必要がありますが、必要のない最後の更新より高いか、または一致する必要があります繰り返されます。)
私はこれを非常に多く行ったので、drushモジュールを作成して、システムテーブルの更新バージョンをロールバックしました。更新ロールバックのために「uroll」と呼ばれます。
https://github.com/danshumaker/drush-uroll
使用法:drush uroll --module = mycustommodule --version = 5
とてもシンプルですが、いつも使っています。これをデータベースバックアップの再読み込みスクリプトと組み合わせると、更新関数を作成するときにすすぎ、繰り返すことができます。
うまくいけばあなたに役立つ。幸運を。
更新フックを再度実行するには、schema_versionをフックのシーケンス番号の下の1に設定する必要があります。
技術的には、再実行したいフックの下、およびの上再実行する必要がない、または再実行したくない更新フック(ただし、少なくとも0; -1は、モジュールがインストールされていない)は問題ありません。他の更新フックがない場合、つまり0でもこれらの境界の間にあることを意味しますが、通常、更新フックは1ずつ増加するため、コードをさらに実行したくない場合は、1だけ低くすることが唯一の安全なオプションです。現在の最高の更新フックよりも。
更新プロセスは、単にその値をチェックし、より大きなシーケンス番号を持つ更新フックがあるかどうかを確認します。その場合は、それらを順番に実行します。 (これは、インストールプロセスがスキーマバージョンを利用可能な最も高い更新フックに対応するものに設定することも意味します。インストール時に、モジュールがその最後の更新フックに対応する状態を持つことを前提としています)。
まだ答えを探している人のために、あなたはこれを3つの方法で達成することができます:
SQL:UPDATE system SET schema_version = [N *] WHERE name = '[モジュールの名前]';
Drush:drush ev "drupal_set_installed_schema_version( '[モジュールの名前]'、[N *])"
Drush uroll drush uroll --module = [モジュール名] --version = N *
* Nは、復帰する更新関数です(つまり、最後に成功した更新関数)。