bir modülün hook_update_n durumunu sıfırlama


14

Daha önce yazdığım bir modülü genişletiyorum ve uyguladığım bazı şema değişikliklerine ihtiyacı var hook_update_N.

Ben gelen modülün versiyonunu güncelledik 7.x-1.0için 7.x-1.1ve uygulanan foo_update_7100ve cezası çalışır.

Sorun şu ki, içeride bir hata yaptım foo_update_7100ve şimdi düzelttiğime göre 7100 güncellemesini tekrar çalıştıramıyorum. Bir 7101 tane oluşturmam gerekiyor ama bu hiç bir anlam ifade etmiyor çünkü tüm değişikliklerim henüz tamamlanmadı.

Ben üzerinden hook_update_n durumunu sıfırlama denedim:

update system set schema_version=-1 where name='foo';

> Query OK, 1 row affected (0.01 sec)
> Rows matched: 1  Changed: 1  Warnings: 0

Sonra yapıyorum drush cc allama drush updatedb -yyine de bana "veritabanı güncelleme gerekli" veriyor.

Sadece hook_update_Nsayıyı artırmak yerine bunu nasıl çözebilirim ?


1
-1 yerine 0 olarak ayarlamayı deneyin.
Andy

Teşekkürler. İşe yaradı. -1Modülün kurulu olmadığı anlamına gelen açıkça belirtilen sütun açıklamasını görmeliydim . Bunu cevap olarak yayınlamaktan çekinmeyin, böylece kabul edebilirim.
cherouvim

Yanıtlar:


14

0 olarak ayarlanması gerekir. system_schema()değerin şöyle olması gerektiğini söylüyor:

-1 modül kurulu değilse (tabloları mevcut değilse); 0 veya modülün ilk kurulduğunda çalıştırılan veya var olan hook_update_N () işlevinin en büyük N değeri.


1
Aslında, bu sadece tek güncelleme kancasıysa işe yarar; bu durum tüm güncelleme kancalarının tekrar çalışmasına neden olur . Değeri, yeniden çalıştırmanız gereken güncelleme kancası sayısının altına 1 olarak ayarlamak daha güvenlidir (ve sonraki sayılara sahip kancalar da çalışacaktır).
Eelke Blok

Bir nedeni var mı -1Drupal söylediği bir modül için yukarı gösterecektir edilir etkin?
cdmo

6

FYI, Drupal 8'de sistem tablosu kaldırıldı ve bu bilgiler artık key_value tablosunda saklanıyor .

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

(Yukarıda belirtildiği gibi, gerçek değer tekrarlamak istediğiniz hook_update_N () değerinden daha az olmalı , ancak tekrarlanması gerekmeyen son güncellemeden daha yüksek veya eşleşmelidir.)


3

Bunu o kadar çok yaptım ki sistem tablosundaki güncelleme sürümünü geri almak için bir drush modülü yazdım. Güncelleme geri alımı için "uroll" olarak adlandırıldı.

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

Kullanım: drush uroll --module = mycustommodule --version = 5

Çok basit ama her zaman kullanıyorum. Bu bir veritabanı yedekleme yeniden yükleme komut dosyası ile birlikte güncelleme işlevleri yazarken durulama ve tekrarlama sağlar.

Umarım size yardımcı olur. İyi şanslar.


Müthiş! Drupal 7 mi, Drupal 8 mi?
Ignacio Segura Postigo

1
D7 şimdilik sadece.
Dan Shumaker

İyi bir tane. Bana yardımcı oldu. Sadece açıklamak için benim hook_update_N mymodule_update_7000 gibi ise o zaman sürüm için drush uroll komutunda 0 koyabilirsiniz.
Austin

1
@Kamal Üzgünüm daha iyi belgelemeliyim. Eğer şu anda kullandığınız kanca hook_update_N 7300 ise o zaman uroll verecek --module=mymodule --version=7299 sys tablo sizinkinden önce bir ayarlar. Böylece bir sonraki dbup üzerinde 7300 çalıştırmak. Yani, hayır, sadece son iki basamağı vermeyin, ancak mymodule_update_9123667 olabilir ne olursa olsun tam sayıyı verin :) :) @Eelke'nin cevabında da iyi bir açıklama var.
Dan Shumaker

0

Güncelleme kancanızın tekrar çalışmasını sağlamak için, schema_version'ı çağanozunuzun sıra numarasının altında 1 olarak ayarlamanız gerekir .

Teknik olarak, kanca kısmındaki her şey sen yeniden isteyen ve yukarıda size ihtiyacım yok güncelleme kanca / (ama en azından 0; -1 araçları modülü kurulu değil) yeniden incelemek istiyorum Tamam; başka güncelleme kancası yoksa, bu sınırlar arasına 0 bile düştüğü anlamına gelir, ancak tipik durumda güncelleme kancaları bir arttırılır, bu nedenle daha fazla kod çalıştırmak istemiyorsanız sadece 1 aşağı gitmek tek güvenli seçenektir mevcut en yüksek güncelleme kancasından daha yüksek.

Güncelleme işlemi sadece bu değeri kontrol eder ve sıra numarası daha yüksek olan güncelleme kancaları olup olmadığını görür. Öyleyse, bunları sırayla çalıştırır. (Bu aynı zamanda kurulum işleminin şema sürümünü mevcut en yüksek güncelleme kancasına karşılık gelen şekilde ayarladığı anlamına gelir; kurulumdan sonra modülünüzün bu son güncelleme kancasına karşılık gelen bir duruma sahip olacağını varsayar).


0

Hala bir cevap arayan herkes için bunu 3 şekilde başarabilirsiniz:

  • SQL: UPDATE sistemi SET schema_version = [N *] NEREDE ad = '[Modül adı]';

  • Drush: drush ev "drupal_set_installed_schema_version ('[Modül adı]', [N *])"

  • Drush uroll drush uroll --module = [Modül adı] - sürüm = N *

* N, geri dönmek istediğiniz güncelleme işlevidir (yani son başarılı güncelleme işlevi)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.