web-dev-qa-db-ja.com

hook_schemaはインストールしますが、アンインストールはしません

モジュールを有効にすると、hook_schemaで定義したテーブルがどのように作成されるのかわかりませんが、(無効にした後)モジュールをアンインストールしても削除されません。

Drupal 7のドキュメントでは、これらのイベントが発生したときにテーブルが自動的に作成および削除されるようになっています。

_my_module.install_内のコードの関連部分は次のとおりです。

_function my_module_schema(){
    $schema = array();
    $schema["my_module_table_xyz"] = array(
            ...
    );
    return $schema;
}
_

それがmodue名とテーブル名の違いに関連しているかどうか、または_hook_uninstall_...にあるコードからの何かに関連しているかどうかはわかりません...

ノードタイプも定義していることを考慮すると、_hook_uninstall_はそれを削除し(次のコードを参照)、以前に定義されたスキーマをsystemが自動的にアンインストールするはずです。

_function my_module_uninstall(){
    ...
    node_delete_multiple(...);
    // delete custom fields
    node_type_delete(...);
    field_purge_batch(...);
}
_

についてどう思いますか?ありがとう

注: Drushを使用してモジュールを無効化、アンインストール、再インストールすると、_Table my_module_table_xyz already exist_エラーが発生します。


pdate:クリーンで同じコードを検証したDrupalインストールが期待どおりに機能する(hook_schemaで定義されたテーブルが正常に削除された)。

「問題のある」Drupalインストールでは、_hook_uninstall_の最後にdrupal_uninstall_schema("my_module_table_xyz")を明示的に実行しようとしました(そして、その行の直後にログ命令を挿入しました、壊れることなく実行されることを確認するために)、しかし何も変更されません。テーブルはまだそこにあります!

どんなアイデア/仮説も本当にありがたいです。

3
Pierpaolo Cira

私は同じ問題を抱えていて、最後に手動でhook_uninstall()でそれを実行しましたが、他の手段は見つかりませんでした。

function mymodule_uninstall() {
  $table_name = 'mytable';
  if (db_table_exists($table_name)) {
    db_drop_table($table_name);
  }
}

これが他の誰かの時間を節約することを願っています。

3
nicholas.alipaz