Müssen neue Tabellen in hook_update_N () erstellt werden?


11

Sollte diese Tabelle beim Erstellen einer neuen Tabelle auch in hook_schema()einer hinzugefügt werden hook_update_N()? Oder gibt es einen Trick oder etwas, das ich verpasst habe, damit Datenbank-Updates automatisch Tabellen hinzufügen?

Die Dokumentation von hook_update_N () erklärt nichts über die Einführung neuer Tabellen, während die Dokumentation vonhook_schema() lautet:

Die von diesem Hook deklarierten Tabellen werden automatisch erstellt, wenn das Modul zum ersten Mal aktiviert wird , und entfernt, wenn das Modul deinstalliert wird.

(Highlight ist meins)

Und wenn ja, wie Sie am besten vermeiden, dass die Schemadefinitionen für die neue Tabelle sowohl in hook_update_N () als auch in hook_schema () dupliziert werden. Beziehen Sie sich einfach wie folgt auf das Schema:

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

Scheint zu funktionieren, aber beim erneuten Ändern der Tabelle schlägt dies fehl, wenn ein Benutzer die Aktualisierungen ausführt und zwei oder mehr hook_update_N () ausführen kann. Immerhin: Der erste hook_update_N installiert dann bereits die richtige Datenbank und der zweite hook_update_M () versucht, bereits aktuelle Spalten hinzuzufügen / zu ändern / zu ändern.

Wie gehst du damit um?


Dokumentation finden Sie unter drupal.org/node/150215 . Das Hinzufügen einer neuen Tabelle nach der Installation eines Moduls erfolgt grundsätzlich über hook_update_N. Sie können jedoch auch die Tabellendefinition für neue Benutzer oder Neuinstallationen zum hook_schema hinzufügen. Fassen Sie es also zusammen, wenn Sie Tabellenänderungen vornehmen, um die aktuellen Tabellen über hook_update_N zu aktualisieren, aber Sie führen auch die Änderungen im hook_schema zusammen.
— Junedkazi

1
Es gibt also keine Möglichkeit, eine Verletzung von DRY zu vermeiden. Das Mitleid.
— berkes

nichts, was mir bewusst ist. Sie können jedoch eine kleine Funktion mit der Schemadefinition schreiben und diese Definition in beiden Funktionen aufrufen.
— Junedkazi

@berkes Man könnte eine andere Funktion definieren, die das zusätzliche Schema zurückgibt und sowohl im Update- als auch im Installations-Hook darauf verweist.
— user1359

Antworten:


15

Also nur eine Kopie von drupal.org einfügen. Sie müssen auch die Schemadefinition zu hook_schema hinzufügen.

/**
 * Create new database table {mytable2}.
 */
function mymodule_update_7101() {
  $schema['mytable2'] = array(
     // table definition array goes here
  );
  db_create_table('mytable2', $schema['mytable2']);
}

Meinen Sie damit, dass es keinen anderen Weg gibt, als die Tabellendefinition von hook_schema () nach hook_update_N () zu kopieren? Mit anderen Worten: Gibt es keine Möglichkeit, eine Verletzung von DRY zu vermeiden?
— Berkeley

3
@berkes genau richtig ... es gibt eine sehr gute Erklärung, warum das hier ist , falls Sie es noch nicht gesehen haben
— Clive

@Clive Das ist ein großartiges Beispiel. Ich habe es noch nie gesehen. +1
— junedkazi

@junedkazi Es gibt einen Link zu dem Link, den Sie in Ihrem Kommentar angegeben haben;)
— Clive

-2

mymodule_update_7101 () ist gut, zusammen mit diesem Hook, wenn wir ein hook_install () hinzufügen, um dasselbe auszuführen, während die Modulinstallation anstelle der Definition hook_schema () auch für mich funktioniert.


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


Es ist viel besser, Drupal zu verwenden, um die API wie angegeben zu verwenden. Verwenden Sie hook_schema () und hook_update_N () direkt. Eine Sache, die ich mache, ist, die hook_schema-Implementierung meines Moduls in hook_update_N () aufzurufen und dann die entsprechenden db_ * -Funktionen auszuführen.
— mradcliffe

hook_install()sollte keine hook_update_N () -Implementierungen aufrufen, um eine Tatsache zu erhalten: hook_install()dient zum erstmaligen Installieren eines Moduls, was bedeutet, dass keine Tabellen aktualisiert werden müssen. Außerdem funktioniert Ihr Code nicht für Updates, für deren Ausführung ein Stapel erforderlich ist.
— Kiamlaluno

Dieses Code-Snippet ist nützlich, wenn Sie das Schema aktualisieren und nur zu Bereitstellungszwecken. Für ein vorhandenes Live-System kann dies nicht verwendet werden.
— Akhila V Nair
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.