sql >> データベース >  >> RDS >> Mysql

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

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

    あなたがしたいのは、'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
    


    1. 私のSQLダイナミッククエリが実行され、ストアドプロシージャの変数に出力されます

    2. MySQLのデフォルトのdate()+ 14日、列の場合?

    3. 左外部結合から返されたデフォルトのヌル値を置き換える

    4. 複合主キーを追加するALTERTABLE