2

CakePHP を使用して、2 つのスナップショットがあります。2 つの差分を取得し、その差分を使用して非破壊的な MySQL 更新コマンドを生成しようとしています。

これが私がこれまでに持っているもので、alter table MySQLコマンドを返しますが、最初にそのテーブルを作成する必要があるため、これは機能しません。

    $this->Schema = new CakeSchema();
    $db = ConnectionManager::getDataSource($this->Schema->connection);
    $options = array();
    $Old = $this->Schema->read($options);
    $Schema = $this->Schema->load();
    $compare = $this->Schema->compare($Old, $Schema);
    $contents = array();

    if (empty($table)) {
        foreach ($compare as $table => $changes) {
            $update = $db->alterSchema(array($table => $changes), $table);
        }
    }
    $this->Installer->query($update);
4

1 に答える 1

2

スキーマ シェルがすべての差分を管理します。不要なフープを飛び越える必要はありません。次の 2 つのことだけを心配する必要があります。

1-生成されたスキーマを常に保持する必要があります。

cake schema generate

これは、基本スキーマだけでなく、スナップショットも保持するために使用されます。次に、これからデータベースを作成できます。

cake schema create

これは、新しいインストールをセットアップするとき、またはデータベースに存在しないテーブルを作成するときに使用されます。これは破壊的であり、すべてのテーブルを削除して再作成します。不足しているテーブルを 1 つ作成する場合は、次のように呼び出すことができます。

cake schema create app {table_name}

2- 常にスキーマのスナップショットを作成します。これにより、既存のデータベースへの非破壊的なアップグレードが可能になります。次のようにスキーマをアップグレードできます。

cake schema update {#}

更新: これを UI で実行できるプロセスにしたい場合は、コントローラーからシェルを呼び出すことができます。私はそれを次のように構成します:

  • コード内のバージョン番号を維持する (Bootstrap) ユーザーを最新の状態に保つ
  • データベース内のバージョン バージョンを比較して、必要があるかどうかを確認します。
  • アップグレードが必要な各バージョンのアップグレード シェルを呼び出します。

  • アップグレードシェルによって呼び出されるアップグレード バージョンごとにタスクを用意する

このようにして、誰かが複数のバージョンを介してアップグレードする必要がある場合、それらはすべて同じアップグレード プロセスで実行されます。

于 2012-09-05T15:25:43.163 に答える