Wie gebe ich an, in welcher Datenbank mein Schema erstellt werden soll?


12

Wie kann ich bei Verwendung mehrerer Datenbanken in Drupal 7 festlegen, dass eine Tabelle in einer anderen Datenbank auf einem anderen Server erstellt werden soll?

Wenn Sie ein Modul installieren, geht Drupal standardmäßig davon aus, dass alles hook_schema()in der Standarddatenbank installiert sein soll. Gibt es eine Möglichkeit, anzugeben, dass eine Tabelle in einer anderen Datenbank erstellt werden soll, oder gibt es eine manuelle Problemumgehung, die ich verwenden kann?


Mein erster Gedanke ist, dass Sie dies auf API-Ebene nicht tun können. Grund dafür ist, dass Ihr Modul an eine bestimmte und seltene Datenbankkonfiguration gebunden ist. Ich gehe davon aus, dass dies ein ortsspezifisches Modul ist. Ich glaube, dass Ihr Update auch Site / DB-Konfiguration spezifisch sein muss.
Letharion

Antworten:


4

Ich glaube nicht, dass es eine offizielle API gibt. Es macht nicht viel Sinn, dies im Allgemeinen zu tun.

Abgesehen davon müssen Sie Ihrem hook_schemaNamen nur einen anderen Namen geben als yourmodule_schema(im Grunde das, was Sie wollen yourmodule_schema_otherdb) und dann in hook_install () zuerst Ihre Datenbank wechseln und dann replizieren, was drupal_install_schema () tut, außer dass Sie Ihre benutzerdefinierte Schemadefinition aufrufen Funktion und schalten Sie die Datenbank wieder auf den Standard.

Denken Sie auch daran, umzusetzen hook_uninstall().

Keine Ahnung, warum du das machen willst. :)


Der Zweck (in diesem Fall) ist zersplittert, aber ich kann mir viele triftige Gründe vorstellen, warum Sie dies tun würden. In Anbetracht der Schwierigkeiten, die mit der Behebung dieses Mangels verbunden wären, werde ich wahrscheinlich nur ein Buch mit CREATE TABLEErklärungen dazu schreiben .
mikl

Wofür du auch das entsprechende hook_uninstall () schreiben musst, wenn du es richtig machen willst :) Nicht sicher, ob ich die Probleme sehe, von denen du sprichst, alles was du tun musstest ist hook_enable zu implementieren (was du in 6 tun musstest) Kopieren Sie die wenigen Codezeilen in drupal_install_schema () und passen Sie sie an. Insbesondere wenn Ihre Tabellen in mehreren Datenbanken angezeigt werden sollen, können Sie hook_schema () verwenden, um sie in der Standarddatenbank zu haben, und hook_install () kann dies auch für die anderen Datenbanken tun. Möglicherweise können Sie zwischen dem Umschalten der Datenbank auch einfach drupal_install_schema ($ yourmodule) aufrufen.
Berdir

11

Ich habe dies mit den Informationen von Berdir erreicht . Mein Code sieht so aus:

<?php
function mymodule_schema_otherdb() {
  $schema['mytable'] = array(
    'description' => 'My table description',
    'fields' => array(
      'myfield' => array(
        'description' => 'My field description',
        'type' => 'serial',
        'size' => 'medium',
        'not null' => TRUE,
        'unsigned' => TRUE,
      ),
    ),
    'primary key' => array('myfield'),
  );
  return $schema;
}

function mymodule_install() {
  db_set_active('otherdb');
  $schema = mymodule_schema_otherdb();
  foreach ($schema as $name => $table) {
    db_create_table($name, $table);
  }
  db_set_active();
}

function mymodule_uninstall() {
  db_set_active('otherdb');
  $schema = mymodule_schema_otherdb();
  foreach ($schema as $name => $table) {
    db_drop_table($name);
  }
  db_set_active();
}

Es wäre nicht zu viel Arbeit, ein Modul zu finden, das nach diesem Hook sucht und bei der Installation und Deinstallation ausgelöst wird. mit anderen db ist ein Schlüssel der Schema-Struktur
Jeremy Französisch

@JeremyFrench, erfordert dieses Setup, dass die leere Datenbank im Voraus erstellt wird? Ich gehe davon aus.
zkent

1

Eine Drupal 8 Version des * .install Datei Code zur Verfügung gestellt von @ Елин Й .:

Hinweis: Die Datenbank muss vorhanden und in settings.php angegeben sein.

<?php
function mymodule_schema_otherdb() {
  $schema['mytable'] = array(
    'description' => 'My table description',
    'fields' => array(
      'myfield' => array(
        'description' => 'My field description',
        'type' => 'serial',
        'size' => 'medium',
        'not null' => TRUE,
        'unsigned' => TRUE,
      ),
    ),
    'primary key' => array('myfield'),
  );
  return $schema;
}

/**
 * Implements hook_install().
 */
function mymodule_install() {
  \Drupal\Core\Database\Database::setActiveConnection('otherdb');
  $connection = \Drupal\Core\Database\Database::getConnection();

  $schema = mymodule_schema_shared();
  foreach ($schema as $name => $table) {
    $connection->schema()->createTable($name, $table);
  }

  \Drupal\Core\Database\Database::setActiveConnection();
}

/**
 * Implements hook_uninstall().
 */
function mymodule_uninstall() {
  \Drupal\Core\Database\Database::setActiveConnection('otherdb');
  $connection = \Drupal\Core\Database\Database::getConnection();

  $schema = mymodule_schema_shared();
  foreach ($schema as $name => $table) {
    $connection->schema()->dropTable($name);
  }

  \Drupal\Core\Database\Database::setActiveConnection();
}

Hier ist ein Gist .


-2

In Settings.php
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
In hook_schema db_set_active('sec_db')wird nun eine Verbindung zu Ihrer anderen DB hergestellt, nicht sicher, ob dies empfohlen wird oder nicht auf eigenes Risiko. Und Sie können db_prefix verwenden, um eine Abfrage von dieser sekundären Datenbank durchzuführen. Sie können das db-Präfix in settings.php verwenden


Das wäre allerdings systemweit, was das OP bereits kann
Clive

Was wäre systemweit? bitte klären
GoodSp33d

1
Diese Semantik ( $db_url, $db_prefixals globale Einstellung für Drupal 6. Und der Punkt-Notation funktioniert nur , wenn eine andere Datenbank auf demselben MySQL - Server verwenden, nicht , wenn (wie in meinem Fall) Sie Zugriff auf verschiedene Server.
mikl

@kantu OP fragt, wie die Datenbank für eine bestimmte Tabelle geändert werden soll. Ihre ursprüngliche Lösung (vor der Bearbeitung) hätte die Änderung systemweit und nicht tabellenweise vorgenommen.
Clive

2
Und wie bereits erwähnt, gibt es in Drupal 7 keine $db_urloder eine globale $db_prefixVariable, und selbst wenn dies der Fall wäre, würde dies das Problem nicht lösen.
mikl
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.