module.installが実行されない時の対処

自作モジュールを開発する場合に、はじめにデータベースアクセス以外のインターフェイス部などを実装し、あとからデータベース関連のコードを実装する場合に作成したmodule.installファイルが実行されない状態になることがあります。同様にmodule.installを変更した場合にも新しいmodule.installはそのままでは実行されません。この記事ではこの対処方法を説明します。

例として、sample.moduleというモジュールを作成し、これをテストして、後からデータベースにテーブルを追加するsample.installを作成した場合に、このsample.installがモジュールを無効にして再度有効にしても実行されないのです。

これは、Drupalのシステムがそのモジュールを一度でも実行すると、そのモジュールが現在有効か無効かにかかわらずにそのモジュールを過去に実行したことを記憶していているためです。つまりデータベースにテーブルを作成するsample.installは1度だけ実行すれば良いので、有効・無効を切り替えるだけでは再度実行をしてくれないのです。では、後からsample.installを作成したり、sample.installを修正した場合にはどうすればいいかというと以下の3つの方法があります。

  • 直接データベースを操作して新規テーブルを作成(CREATE)したり、修正(ALTER)したりする
  • Drupalのsystemテーブルから対象モジュールのレコードを削除する
  • 開発者向けのdevelモジュールをインストールして、そこからreinstall moduleを実行する

ここでは、直接データベースを操作する方法についての説明は省略いたします。

Drupalのsystemテーブルから対象モジュールのレコードを削除する方法
この方法をおこなう場合には、まずそのモジュールを無効にして、systemテーブルから対象モジュールのレコードを削除します。仮にsampleモジュールがsample.infoにおいてSampleという名前で登録されている場合に、MySQLでは以下のようなQueryになります。

mysql> DROP FROM system WHERE name = 'Sample';

これで、sampleモジュールを再び有効にすると、sample.installが実行されることになります。sample.installを変更した場合にもこの方法は使えます。

drupal.orgの以下の記事の一番最後にこのことがちょっとだけ書かれています(英語)
http://drupal.org/node/51220

開発者向けのDevelモジュールを使用する方法
一番簡単なのはDevelモジュールをインストールしておき、Reinstall module機能を選択してそこから対象となるモジュールを選択してreinstallをおこなう方法です。この操作により選択したモジュールのhook_uninstallとhook_install(共にmodule.installに通常含まれるフック関数)が実行されますので、直接データベースをさわったりする必要もなくDrupalの中から行えるのでとても簡単です。

Develモジュールはこれ以外にも開発者向けの便利な機能が満載ですので、Drupal開発者には必須のモジュールと言えます。Develモジュールのダウンロードは以下のプロジェクトページからどうぞ
http://drupal.org/project/devel
Develモジュールの便利な利用方法は当サイトでも今後紹介していきたいと思います。

新しいコメントの投稿

このフィールドの内容は非公開にされ、公表されることはありません。
  • 使用できるHTMLタグ: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • 行と段落は自動的に折り返されます。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。

書式オプションに関するより詳しい情報...

CAPTCHA
この質問はスパムを防止するために貴方が人間か自動スパム送信プログラムかを判断するためのものです
2 + 0 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.