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?

berkes
quelle
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']);
}
junedkazi
quelle
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();
    }
  }
}

Akhila V Nair
quelle
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