web-dev-qa-db-ja.com

PHP / MySQLアプリケーションの移行(スキーマとデータ)を自動化する方法

PHP/MySQLのアプリケーションがあります。アプリケーションの背後にあるデータベースをアップグレードする自動化された方法を探しています。アップグレードした後は、古いバージョンとの互換性は必要ありません。

私はこれに関する jeff'sK。Scott Allen's の記事を読みました。

PHP/MySQLアプリケーションにこれを実装する方法がまだわかりません。

このための簡単で良いプロセスはありますか?

23
Sabya

私が使用する「スキーマ」オブジェクトがありますが、クラスがなくても同じことができます。

あなたがしたいのは 'db_schema_versions'テーブルを作成することです:

CREATE TABLE db_schema_versions (
  `table` varchar(255) NOT NULL PRIMARY KEY, 
  `version` INT NOT NULL
)

データベースがバージョン番号を追跡できるようになると、SQLアップグレードを自動的に実行できます。

スキーマをアップグレードするときは、スキーマテーブルをロックする必要があります。このようにして、スキーマをアップグレードしようとして同時に2つのリクエストが発生することはありません。

したがって、アップグレード元のバージョンを追跡します。大きなスイッチを作成します。次のようになります。

class SNTrack_Db_Schema extends MW_Db_Schema_Abstract {
  protected $table = "sntrack_db_schema";
  protected $version = 5;

  protected function upgrade($fromVersion) {
    // don't break
    switch($fromVersion) {
      case 0:
        $this->db->query('CREATE TABLE sntrack_inbound_shipment (
            `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
            `from` VARCHAR(255) NOT NULL,
            `date` DATE NOT NULL,
            `invoice` VARCHAR(255) NOT NULL,
            `notes` TEXT
          )');
        $this->setVersion(1);
      case 1:
        $this->db->query('ALTER TABLE sntrack_details ADD `shipment_id` INT');
        $this->db->query('ALTER TABLE sntrack_product ADD `inventory` INT NOT NULL DEFAULT 0');
        $this->db->query('CREATE TABLE sntrack_inventory_shipment (
            `shipment_id` INT NOT NULL,
            `product_id` INT NOT NULL,
            `qty` INT NOT NULL,
            PRIMARY KEY (`shipment_id`, `product_id`)
          )');
        $this->setVersion(2);
...etc
18
gnarf

Gnarfの提案と同様に、私は次のように実行します。

  • スキーマを変更するたびに、実行時に古いバージョンから新しいバージョンに移動するSQLファイルを作成します(これは、メジャーバージョンごとに1つのファイル、または多数の小さな変更である可能性があります)。
  • 適用する必要のある順序で各SQLファイル名をリストする個別のファイルを作成します(一番上が最も古く、一番下が最も新しい)
  • データベースに単純な「バージョン管理」テーブル(必要なのは単一のVARCHAR列のみ)を作成します

次に、次のように機能する簡単なスクリプトを作成する必要があります。

  • 最後に適用されたSQL更新ファイルの名前をバージョン管理テーブルに照会します
  • 実行する新しいSQL変更ファイルがある場合は、それらを順番に実行します
  • 適用された最新のSQLファイルの名前を記録します

私はそれが理にかなっていることを願っています

4
James C

スキーマの移行にこのツールを使用してみてください: https://github.com/idler/MMP/

3
Maxim Antonov

PHPでMySQL用の小さな移行スクリプトを作成しました。これは、初期段階のプロジェクトや、より複雑な移行スクリプトを(まだ)必要としないプロジェクトに適しています。 https://github.com/kennberg/php-mysql-migrate

2
Alex Kennberg

私は同じ目標を達成しました。大きなデータベース(一部のテーブルでは100万行以上)を移行することです。 https://phinx.org を使用することを検討しています。これは、スキーマの移行を処理するのに適しているようです。さらに、安全のためのロールバックオプションが付属しています。

0
Ousmane

MySQLベンチソフトウェア(mysqlのWebサイトにあります)がそれを行います。ただし、クリックの多い手順を繰り返す必要があります。

0
Rolf

使用migratedb https://github.com/malukenho/MigrateDB from @malukenho

0

このライブラリを試すことができます: mysql-version-control

スキーマ、コアデータ、テストデータを区別するのでこれが好きです。しかし、それでも本当に使いやすい方法でそれを行います。

0
Joe Green

できません。あなたも

  1. ソース環境で実行されたすべてのSQLを使用して更新ファイルを書き込み、SVNのように実行します(上記)。実行にはphpスクリプトが必要で、SQL書き込みには手作業が必要です

  2. 両方の環境を事後分析し、どの更新を移行する必要があるかをユーザーに提案します。基本的に最初のものと同じですが、移行のための大きなステップが1つあり、小さなチャンクがたくさんない点が異なります。 SQLyogは、スキーマとデータの両方の違いを分析できます。

0
Artjom Kurapov

無料のAPIを使用することもできます SqlQuerySync

または、CREATE/ALTER/DELETEクエリを管理するデータベーステーブルを自分で作成します。

0
user1122069

これを実行する1つの方法は、mysqldumpを使用してデータベースを大きなSQLファイルにダンプすることです。そのファイルを取得して、新しいインストール内で入手するだけです。

0
Antonio Haley