it-swarm.com.de

Gelöschtes Feld aus Datenbank löschen

Ich habe Felder erstellt, die gelöscht wurden. Tabellen für die Felder sind beim Löschen verschwunden, befinden sich jedoch noch in field_config und field_config_instance

Gibt es überhaupt eine Möglichkeit, sie zu reinigen?

Vielen Dank

9
lusketeer

Die Einträge in field_config Und field_config_instance Hatten wahrscheinlich den Wert 1 In der Spalte deleted.

Dies bedeutet, dass sie zum Löschen markiert sind, aber erst gelöscht werden, wenn Sie cron ausführen (gelöschte Felddaten werden in field_cron() gelöscht).

10
Clive

mit drush:

$ drush eval "field_purge_batch(500)"

möglicherweise müssen Sie einige Male ausführen oder $ batch_size erhöhen, dann gibt es möglicherweise auch nach dem Ausführen von cron noch die Tabellen field_deleted und field_deleted_revision

abfrage

SELECT * FROM `field_config` WHERE `deleted` = 1
SELECT * FROM `field_config_instance` WHERE `deleted` = 1

wenn Sie leer sind, können Sie diese verbleibenden Tabellen sicher löschen

11
decibel.places

Alternativ zum Ausführen von cron zum Entfernen gelöschter Daten können Sie field_purge_batch ($ batch_size) manuell ausführen.

Um die Funktion manuell auszuführen, können Sie entweder:

  • Bootstrap Drupal in einer PHP-Datei
  • Erstellen Sie einen Menü-Hook-Page-Rückruf
  • Wenn Sie das Entwicklungsmodul installiert haben, besuchen Sie/devel/php

Die zu verwendende $ batch_size hängt von Ihrer Serverumgebung und Ihren Anforderungen ab. Ich habe Werte so niedrig wie 5 und so hoch wie 10000 verwendet.

6
Cody Craven

Für diese Drupal 8 Benutzer,

Ich habe das auch erlebt, grabe den Code aus. Ich fand dies alles Grund, warum Felder nicht gelöscht wurden, nachdem Sie dies getan haben:

  • cron Gazillion mal ausführen
  • führen Sie drush eval "field_purge_batch (500)" millionenfach aus

Die Felder bleiben bestehen und verschwinden nicht. Dies liegt an einer Logik hier in field_purge_batch

  // We cannot purge anything if the entity type is unknown (e.g. the
  // providing module was uninstalled).
  // @todo Revisit after https://www.drupal.org/node/2080823.
  if (!isset($info[$entity_type])) {
    continue;
  }

Die abhängigen Module werden deinstalliert. Aus diesem Grund werden die Felder nicht entfernt.

Wie kann man das lösen? Es wird empfohlen, das Modul zuerst neu zu installieren, diese Felder zu löschen und wieder zu deinstallieren. So finden Sie heraus, welches Modul Sie neu installieren müssen:

$fields = entity_load_multiple_by_properties('field_config', array(
  'deleted' => TRUE,
  'include_deleted' => TRUE,
));
dpm($fields); // this is devel module of var_dump

// check the protected member called "dependencies"

Falls Sie diesen Ansatz der Neuinstallation des Moduls nicht verwenden möchten, können Sie ihn auch sofort löschen. Ich bin mir nicht sicher, wie es sich verhält, aber es sollte den Job erledigen.

Backup zuerst !!!

Ja, sei nicht faul, es wird deinen Arsch retten, wenn etwas schief geht.

$fields = entity_load_multiple_by_properties('field_config', array(
  'deleted' => TRUE,
  'include_deleted' => TRUE,
));

foreach ($fields as $field) {
  $field->delete();
}

// Retrieve all deleted field storages. Any that have no fields can be purged.
$deleted_storages = \Drupal::state()->get('field.storage.deleted') ? : array();
foreach ($deleted_storages as $field_storage) {
  $field_storage = new FieldStorageConfig($field_storage);
  $fields = entity_load_multiple_by_properties('field_config', array('field_storage_uuid' => $field_storage->uuid(), 'include_deleted' => TRUE));
  if (empty($fields)) {
    field_purge_field_storage($field_storage);
  }
}

Mach das Cron zum letzten Mal. Ich hoffe es wird das Problem beheben :)

4
kororo

Kann keine Lösung finden. Also habe ich sie manuell aus diesen beiden Tabellen gelöscht.

0
lusketeer