web-dev-qa-db-ja.com

既存のデータを失わずにデータベーススキーマを更新する方法

Mysqlで2つのデータテーブルを定義するmy_module.installファイルを持つカスタムモジュールがあります。モジュールはすでにインストールされており、フォームからそれらにデータを保存できます。これで要件が変更され、同じモジュール内に3番目のテーブルを作成する必要があります。モジュールの再インストールにはどうすればよいですか。

1)MYSQlスクリプトを準備して既存のデータを一時テーブルにバックアップし、モジュールをアンインストールして再インストールした後、データを一時テーブルからテーブルにコピーします。

2)を調べた https://www.drupal.org/project/backup_migrate 互換性がないdrupalコアバージョン8.6.0を使用している

3)他のモジュールやアイデアはありますか?

提案後に編集:mymodule.installファイルに以下の関数を作成し、mymodule_schema()メソッドを編集して、drush updatedbを実行しました。それでも、予期したテーブルが作成されないため、dbは変更されません。現在のローカルDBではテーブルが使用できないため、他の場所で言及されているように、システムテーブルを調べて最新バージョン番号を取得できません。

   function mymodule_update_8601(){
    $spec = array(
    'fields' => array(
     'application_setup_id' => array(
     'type' => 'serial',
     'not null' => TRUE,
     'description' => 'Primary Key: ID',
     ),
    ),
   );
   $schema = Database::getConnection()->schema();
   $schema->createTable('application_setup', $spec);
  }
1
user3324848

データベーススキーマの変更を適用する場合は、モジュールを再インストールしないでください。 _MYMODULE.install_ファイルから hook_update_N() を介してこれらの変更を適用します。

drupal.orgのDrupal 8 のデータベーススキーマやデータの更新を参照)。

モジュールがhook_schema()で定義するデータベーススキーマに関連するデータモデルを変更している場合は、データモデルを適切に更新する必要があります。 2つのステップは次のとおりです。

  1. データベーステーブルとフィールド定義が変更された場合に新しいデータモデルを反映するように、hook_schema()コードを更新します。これにより、変更を加えた後にモジュールをインストールする人が正しいデータベーステーブルを確実にインストールできます。詳細については、スキーマAPIのドキュメントを参照してください。
  2. hook_update_N()関数を記述します。これにより、変更を加える前にすでにモジュールをインストールしていたモジュールの既存ユーザーのデータベースが更新され、ユーザーは引き続き機能できるようになります。これについては以下で説明します。

hook_update_N()から新しいテーブルを追加する方法のサンプルもあります。

_$spec = [
  'description' => 'My description',
  'fields'      => [
    'myfield1' => [
      'description' => 'Myfield1 description.',
      'type'        => 'varchar',
      'length'      => 255,
      'not null'    => TRUE,
      'default'     => '',
    ],
    'myfield2' => [
      'description' => 'Myfield2 description',
      'type'        => 'text',
      'not null'    => TRUE,
    ],
  ],
  'primary key' => ['myfield1'],
];
$schema = Database::getConnection()->schema();
$schema->createTable('mytable2', $spec);
_
3
leymannx