Haruskah tabel baru dibuat di hook_update_N ()?

11

Saat Anda membuat tabel baru di hook_schema(), haruskah tabel itu ditambahkan hook_update_N()juga? Atau ada beberapa trik, atau sesuatu yang saya lewatkan, agar pembaruan databae secara otomatis menambahkan tabel?

Dokumentasi hook_update_N () tidak menjelaskan apa-apa tentang memperkenalkan tabel baru, sedangkan dokumentasihook_schema() mengatakan:

Tabel yang dideklarasikan oleh kait ini akan secara otomatis dibuat ketika modul pertama kali diaktifkan , dan dihapus ketika modul dihapus instalasinya.

(Sorot adalah milikku)

Dan jika demikian, cara terbaik menghindari duplikasi definisi skema untuk tabel baru di hook_update_N () dan hook_schema (). Cukup mengacu pada skema sebagai berikut:

 function hook_update_N(&$sandbox) {
   $schema = hook_schema();
   $name = "foo";
   $table = $schema["foo"];
   db_create_table($name, $table);
 }

Tampaknya berfungsi, tetapi saat mengganti tabel lagi, akan gagal jika pengguna menjalankan pembaruan dan menjalankan dua atau lebih hook_update_N (). Setelah semua: hook_update_N pertama kemudian akan menginstal database yang benar dan hook_update_M kedua () akan mencoba untuk menambah / mengubah / mengubah kolom yang sudah terbaru.

Bagaimana Anda menangani ini?

berkes
sumber
Rujuk ke drupal.org/node/150215 untuk dokumentasi. Jadi pada dasarnya untuk menambahkan tabel baru setelah modul diinstal adalah melalui hook_update_N tetapi Anda juga menambahkan definisi tabel ke hook_schema untuk pengguna baru atau instalasi baru. Jadi jumlah itu jika Anda membuat perubahan tabel apa pun untuk memperbarui tabel saat ini melalui hook_update_N tetapi Anda juga menggabungkan perubahan di hook_schema.
junedkazi
1
Jadi sepertinya tidak ada cara untuk menghindari melanggar KERING, tampaknya. Kasihan.
berkelanjutan
tidak ada yang saya sadari. Tetapi Anda dapat menulis fungsi kecil yang memiliki definisi skema dan memanggil definisi itu di kedua fungsi.
junedkazi
@berkes One dapat mendefinisikan fungsi lain yang mengembalikan skema tambahan dan merujuknya di pembaruan dan menginstal kait.
user1359

Jawaban:

15

Jadi tinggal copy paste dari drupal.org. Anda juga perlu menambahkan definisi skema ke hook_schema.

/**
 * Create new database table {mytable2}.
 */
function mymodule_update_7101() {
  $schema['mytable2'] = array(
     // table definition array goes here
  );
  db_create_table('mytable2', $schema['mytable2']);
}
junedkazi
sumber
Maksud Anda tidak ada cara lain selain menyalin definisi tabel dari hook_schema () ke hook_update_N (). Dengan kata lain: bahwa tidak ada cara untuk menghindari pelanggaran KERING?
berkelanjutan
3
@berkes spot on ... ada penjelasan yang sangat bagus mengapa itu ada di sini jika Anda belum melihatnya
Clive
@Clive Itu adalah contoh yang luar biasa. Belum pernah melihatnya sebelumnya. +1
junedkazi
@junedkazi Ada tautan di tautan yang Anda berikan di komentar;)
Clive
-2

mymodule_update_7101 () bagus, bersama dengan kait ini jika kita menambahkan hook_install () untuk menjalankan instalasi modul yang sama dan bukannya definisi hook_schema () juga berfungsi untuk saya.


/**
 * Implements hook_install().
 */
function mymodule_install() {
  // Change the update number accordingly for more updates.
  for ($i = 7101; $i < 7102; $i++) {
    $update_func = 'mymodule_update_' . $i;
    if (function_exists($update_func)) {
      $update_func();
    }
  }
}

Akhila V Nair
sumber
Adalah praktik Drupal yang jauh lebih baik untuk menggunakan API seperti yang diarahkan. Gunakan hook_schema () dan hook_update_N () secara langsung. Satu hal yang saya lakukan adalah memanggil implementasi hook_schema modul saya di hook_update_N (), dan kemudian menjalankan fungsi masing-masing db_ *.
mradcliffe
hook_install()tidak boleh memanggil implementasi hook_update_N () apa pun, karena fakta sederhana: hook_install()adalah untuk menginstal modul untuk pertama kalinya, yang berarti tidak ada tabel untuk diperbarui. Selain itu, kode Anda tidak akan berfungsi untuk pembaruan yang memerlukan batch untuk dijalankan.
kiamlaluno
Cuplikan kode ini akan berguna, jika Anda memperbarui skema dan hanya untuk tujuan penyebaran. Untuk sistem live yang ada, ini tidak dapat digunakan.
Akhila V Nair