mengatur ulang status hook_update_n dari sebuah modul

14

Saya memperluas modul yang saya tulis sebelumnya dan perlu beberapa perubahan skema yang saya implementasikan hook_update_N.

Saya telah memperbarui versi modul dari 7.x-1.0ke 7.x-1.1dan menerapkan foo_update_7100dan berfungsi dengan baik.

Masalahnya adalah bahwa saya telah membuat kesalahan di dalam foo_update_7100dan sekarang saya sudah memperbaikinya saya tidak bisa memutakhirkan pembaruan 7100. Saya perlu membuat 7101 tapi itu tidak masuk akal karena semua perubahan saya belum dilakukan.

Saya sudah mencoba mengatur ulang status hook_update_n melalui:

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

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

Kemudian saya lakukan drush cc alltetapi drush updatedb -ymasih memberi saya "Tidak diperlukan pembaruan basis data".

Bagaimana saya bisa menyelesaikan ini alih-alih hanya menambah hook_update_Nnomor?

cherouvim
sumber
1
Coba atur ke 0 daripada -1.
Andy
Terima kasih. Itu berhasil. Saya seharusnya melihat deskripsi kolom yang dengan jelas menyebutkan bahwa -1modul tersebut tidak diinstal. Jangan ragu untuk memposting itu sebagai jawaban sehingga saya bisa menerimanya.
cherouvim

Jawaban:

14

Mengaturnya ke 0 harus bekerja. system_schema()mengatakan nilainya harus:

-1 jika modul tidak diinstal (tabelnya tidak ada); 0 atau N terbesar dari fungsi hook_update_N () modul yang telah dijalankan atau ada saat modul pertama kali diinstal.

Andy
sumber
1
Sebenarnya, ini hanya akan berfungsi jika ini adalah satu-satunya kait pembaruan; biasanya, ini akan menyebabkan semua kait pembaruan dijalankan lagi. Lebih aman untuk menetapkan nilai ke 1 di bawah jumlah kait pembaruan yang perlu Anda jalankan kembali (dan kait apa pun dengan nomor berikutnya akan berjalan juga).
Eelke Blok
Apakah ada alasan yang -1akan muncul untuk modul yang Drupal mengatakan yang diaktifkan?
cdmo
6

FYI, di Drupal 8, tabel sistem telah dihapus, dan informasi ini sekarang disimpan dalam tabel key_value .

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

(Seperti disebutkan di atas, nilai aktual harus kurang dari hook_update_N () yang ingin Anda ulangi, tetapi lebih tinggi dari atau cocok dengan pembaruan terakhir yang tidak perlu diulang.)

micahw156
sumber
3

Saya melakukan ini sangat banyak sehingga saya akhirnya menulis modul drush untuk memutar kembali versi pembaruan di tabel sistem. Disebut "uroll" untuk pembaruan rollback.

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

Penggunaan: drush uroll --module = mycustommodule --version = 5

Ini sangat sederhana tetapi saya menggunakannya sepanjang waktu. Ini dikombinasikan dengan skrip memuat kembali basis data memungkinkan Anda untuk membilas dan mengulangi saat menulis fungsi pembaruan.

Semoga bermanfaat buat kamu. Semoga berhasil.

Dan Shumaker
sumber
Luar biasa! Drupal 7 atau Drupal 8?
Ignacio Segura Postigo
1
D7 hanya untuk saat ini.
Dan Shumaker
Ini bagus. Membantuku. Hanya untuk klarifikasi jika hook_update_N saya seperti mymodule_update_7000 maka pada perintah drush uroll Anda untuk versi saya dapat menempatkan 0. Apakah saya benar?
Austin
1
@ Kamal Maaf saya harus mendokumentasikannya dengan lebih baik. Jika kail saat ini, kiriman Anda sedang berada di 7300 maka Anda akan memberikan uroll yang --module=mymodule --version=7299 mengatur tabel sistem sebelum Anda. Jadi pada dbup berikutnya 7300 Anda dijalankan. Jadi, tidak, jangan hanya memberikan dua digit terakhir tetapi seluruh angka yang melewati angka mymodule_update_9123667 .. :) @Eelke juga memiliki deskripsi yang baik dalam jawabannya.
Dan Shumaker
0

Untuk menjalankan hook pembaruan Anda lagi, Anda harus mengatur schema_version ke 1 di bawah nomor urut hook Anda .

Secara teknis, apa pun di bawah kait yang ingin Anda jalankan kembali dan di atas kait pembaruan Anda tidak perlu / ingin menjalankan kembali (tetapi setidaknya 0; -1 berarti modul tidak diinstal) tidak apa-apa; jika tidak ada kait pembaruan lain, itu berarti bahwa bahkan 0 jatuh di antara batas-batas itu, tetapi dalam kasus khas, kait pembaruan diperbarui satu, jadi hanya naik 1 yang lebih rendah adalah satu-satunya pilihan aman jika Anda tidak ingin menjalankan lebih banyak kode dari kait pembaruan tertinggi saat ini.

Proses pembaruan cukup memeriksa nilai itu, dan melihat apakah ada kait pembaruan dengan nomor urut yang lebih tinggi. Jika demikian, itu akan menjalankannya secara berurutan. (Ini juga berarti bahwa proses instalasi menetapkan versi skema ke yang sesuai dengan kait pembaruan tertinggi yang tersedia; itu mengasumsikan bahwa pada saat instalasi, modul Anda akan memiliki status yang sesuai dengan kait pembaruan terakhir).

Eelke Blok
sumber