モジュールのhook_update_nステータスのリセット


14

私は以前に書いたモジュールを拡張していますが、いくつかのスキーマの変更が必要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数字を増やすのではなく、どうすればこれを解決できますか?


1
-1ではなく0に設定してみてください。
アンディ

ありがとう。うまくいきました。私は-1、モジュールがインストールされていないことを意味することを明確に述べている列の説明を見るべきでした。それを回答として自由に投稿してください。そうすれば受け入れられます。
-cherouvim

回答:


14

0に設定すると動作するはずです。system_schema()値は次のようになります。

モジュールがインストールされていない(テーブルが存在しない)場合は-1。0またはモジュールが最初にインストールされたときに実行されたか、存在していたモジュールのhook_update_N()関数の最大N。


1
実際には、これが唯一の更新フックである場合にのみ機能します。通常、これによりすべての更新フックが再度実行されます。再実行する必要がある更新フックの数より1少ない値を設定する方が安全です(以降の番号を持つフックも実行されます)。
Eelkeブローク

-1Drupal 有効になっていると言うモジュールに表示される理由はありますか?
cdmo

6

参考までに、Drupal 8ではシステムテーブルが削除され、この情報はkey_valueテーブルに保存されるようになりました

UPDATE key_value SET value='i:8000;' WHERE collection = 'system.schema' AND name = 'module_name';

(上記のように、実際の値は、繰り返したいhook_update_N()より小さい必要がありますが、繰り返す必要のない最後の更新よりも大きいか、一致する必要があります。


3

私はこれを非常にやったので、システムテーブル内の更新バージョンをロールバックするためのブラシモジュールを書くことになりました。更新のロールバックのために「uroll」と呼ばれます。

https://github.com/danshumaker/drush-uroll

使用法:drush uroll --module = mycustommodule --version = 5

それは非常に簡単ですが、私はいつもそれを使用しています。これをデータベースバックアップリロードスクリプトと組み合わせると、更新機能を記述するときにすすぎ、繰り返すことができます。

お役に立てば幸いです。幸運を。


驚くばかり!Drupal 7またはDrupal 8?
イグナシオセグラポスティゴ

1
現時点ではD7のみ。
ダンシューメーカー

その良いもの。助けて頂きました。明確にするために、私のhook_update_Nがmymodule_update_7000のような場合は、バージョンのdrush urollコマンドで0を入力できます。
オースティン

1
@Kamal申し訳ありませんが、文書化する必要があります。hook_update_Nを作成している現在のフックが7300である場合、uroll --module=mymodule --version=7299 にsysテーブルを1つ前に設定します。したがって、次のdbupで7300が実行されます。だから、いいえ、最後の2桁だけでなく、mymodule_update_9123667である可能性のあるすべての過去の数字を渡さないでください。.)@Eelkeの答えにも良い説明があります。
ダンシューメーカー

0

更新フックを再度実行するには、schema_versionをフックのシーケンス番号の下の1に設定する必要があります

技術的には、フック以下のものは、あなたが再実行したいと必要のない更新フック/(しかし、少なくとも0; -1手段モジュールがインストールされていない)を再実行したいOKです。他の更新フックがない場合、それらの境界の間に0さえも含まれることを意味しますが、典型的な場合、更新フックは1増加します。現在の最高の更新フックよりも。

更新プロセスは単にその値をチェックし、より高いシーケンス番号を持つ更新フックがあるかどうかを確認します。その場合、それらは順番に実行されます。(これは、インストールプロセスが、利用可能な最高の更新フックに対応するスキーマバージョンに設定することも意味します。インストール時に、モジュールはその最後の更新フックに対応する状態になると想定します)。

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