it-swarm-ja.com

データベースから削除されたフィールドを消去

私はそれらを削除したフィールドを作成しました。フィールドのテーブルは削除時に削除されましたが、field_configおよびfield_config_instanceのままです。

とにかくそれらをきれいにすることはありますか?

ありがとう

9
lusketeer

_field_config_および_field_config_instance_のエントリのdeleted列には、_1_の値が含まれている可能性があります。

つまり、削除対象としてマークされていますが、実際にはcronを実行するまで削除されません(削除されたフィールドデータは field_cron() で削除されます)。

10
Clive

drushを使用:

$ drush eval "field_purge_batch(500)"

数回実行するか、$ batch_sizeを大きくすると、cronを実行した後でも、field_deletedテーブルとfield_deleted_revisionテーブルが残っている可能性があります。

クエリ

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

空になった場合は、残ったテーブルを安全に削除できます

11
decibel.places

削除されたデータを削除するためにcronを実行する代わりに、手動で field_purge_batch($ batch_size) を実行できます。

関数を手動で実行するには、次のいずれかを実行できます。

  • ブートストラップDrupal phpファイル内
  • メニューフックページコールバックを作成する
  • Develモジュールがインストールされている場合は、/ devel/phpにアクセスしてください

使用する$ batch_sizeは、サーバー環境とニーズによって異なります。 5から10000までの値を使用しました。

6
Cody Craven

これらのDrupal 8ユーザーの場合、

私もこれを経験しました、コードを掘り下げてください。私がこれを行った後にフィールドが削除されなかった理由は、次のとおりです。

  • cronガジリオン回実行
  • drush eval "field_purge_batch(500)"を100万回実行します

フィールドは消えないわけではありません。これは、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;
  }

依存しているモジュールがアンインストールされます。それがフィールドが削除されない理由です。

これを解決するには?最初にモジュールを再インストールし、それらのフィールドを削除してアンインストールすることをお勧めします。再インストールする必要があるモジュールを見つけるには:

$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"

モジュールを再インストールするそのアプローチを取りたくない場合は、すぐに削除することもできます。動作がどうなるかはわかりませんが、それでうまくいくはずです。

最初にバックアップ!!!

はい、怠惰にしないでください。何かがうまくいかなくてもお尻を救います。

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

前回はcronを実行してください。私はそれが問題を修正することを願っています:)

4
kororo

解決策が見つからないようです。したがって、これらの2つのテーブルから手動で削除することになりました。

0
lusketeer