web-dev-qa-db-ja.com

既存のテーブルデータに影響を与えずに既存のモジュールに新しいテーブルを作成する

テーブルを作成するためのインストールファイルと共に、カスタムモジュールmyCustomModuledrupal 7 Webサイトに持っています。

テーブルに多くのコンテンツを既に保存していますが、以前のテーブルデータに影響を与えずに同じモジュールで新しいテーブルを作成する必要があります。

.INSTALL fileに新しいものを追加した場合、既存のデータコンテンツをテーブルから削除するモジュールをアンインストールしてインストールする必要があります。

既存のテーブルデータに影響を与えずに、既存のモジュールの新しいテーブルを作成する方法はありますか?.

以前のものに影響を与えずにモジュール構造を更新するにはどうすればよいですか。

[または私にとっての最後のオプションは、新しいモジュールを作成して別のテーブルを作成することですが、あまり多くのモジュールを作成したくありません]

助けてください、私はDrupal 7のためにそれを行う必要があります

[〜#〜]編集[〜#〜]

私はこれに従いました link そしてコードを更新した後、以下を試し、キャッシュをクリアしました

/**
 * Create new database table {new_table}.
 */
function my_module_update_7101() {
 $schema['new_table'] = array(
     'description' => 'Table for storing information about static media asset .',
        'fields' => array(
            'aid' => array(
                'type' => 'serial',
                'not null' => TRUE,
                'description' => 'Primary Key: Unique aggregator static media asset ID.',
            ),
            'asset_title' => array(
                'type' => 'varchar',
                'length' => 255,
                'not null' => TRUE,
                'default' => '',
                'description' => 'Title of the static media asset title',
            ),
            'asset_file_path' => array(
                'type' => 'varchar',
                'length' => 255,
                'not null' => TRUE,
                'default' => '',
                'description' => 'CDN url path for asset.',
            ),
            'status' => array(
                'description' => 'status field for the static media assets',
                'type' => 'int',
                'length' => 1,
                'not null' => TRUE,
                'default' => 1,
            ),
        ),
        'primary key' => array('aid'),
    );

  db_create_table('new_table', $schema['new_table']);
}

テーブルを更新していないようです

2
Hitesh

既存のテーブルのデータに影響を与えずに新しいテーブルを生成するアプローチ。

hook_schemaでテーブル構造を宣言します。後でこのモジュールをインストールする新しいユーザーがこのテーブルを取得する必要があるため、ここでhook_schemaにコーディングする必要があります。

/ ** * hook_schema()。 * /

function my_module_schema() {
  $schema = array();
  $schema['new_table'] = array(
    'description' => 'Table for storing information about static media
asset .',
    'fields' => array(
      'aid' => array(
        'type' => 'serial',
        'not null' => TRUE,
        'description' => 'Primary Key: Unique aggregator static media asset ID.',
      ),
      'asset_title' => array(
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '',
        'description' => 'Title of the static media asset title',
      ),
      'asset_file_path' => array(
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '',
        'description' => 'CDN url path for asset.',
      ),
      'status' => array(
        'description' => 'status field for the static media assets',
        'type' => 'int',
        'length' => 1,
        'not null' => TRUE,
        'default' => 1,
      ),
    ),
    'primary key' => array('aid'),
  );
  return $schema;
}

モジュールを既にインストールしていて、新しいテーブルを作成したいユーザーは、以下のようにhook_update_n()と書くことができます。

/ ** * hook_update_n()。 * /

function my_module_update_7001() {
  $schema = my_module_schema();
  if(!db_table_exists('new_table'))
    db_create_table('new_table', $schema['new_table']);
}

ここでは、すべてのスキーマを取得し、db_create_table()を使用して「new_table」を作成します。

これで問題が解決することを願っています。ありがとう。

3
Gaurav Garg

hook_update_n() 、特にAdding a new tableの見出しを参照してください。

  1. 新しいモジュールをmymodule.installのmymodule_schema()に追加します。
  2. Mymodule_update_N()関数を作成して、スキーマAPI関数db_create_table()でmytable 2を作成します。

その後、データベースの更新を実行すると、新しいテーブルが作成されます(example.com/update.phpまたはdrush updb)。

1
skh