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?


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']);
}

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();
    }
  }
}


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.