如何自动化PHP/MySQL应用程序的迁移(模式和数据)

Sab*_*bya 22 php mysql migration deployment

我有一个PHP/MySQL应用程序.我正在寻找一种在应用程序后面升级数据库的自动方式.升级后,我不需要与旧版本兼容.

我已经阅读了杰夫K.斯科特艾伦的文章.

我仍然不确定如何为PHP/MySQL应用程序实现它.

这有什么简单而好的过程吗?

gna*_*arf 18

我有一个"Schema"对象,但是你可以在没有类的情况下做同样的事情.

你想要做的是创建一个' db_schema_versions'表:

CREATE TABLE db_schema_versions (
  `table` varchar(255) NOT NULL PRIMARY KEY, 
  `version` INT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

在您的数据库可以跟踪它所使用的版本之后 - 它可以自动执行SQL升级.

您应该在升级架构时锁定架构表.这样,在尝试升级架构的同一时刻,您将不会有两个请求.

所以 - 跟踪你要升级的版本 - 构建一个大开关 - 如下所示:

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
Run Code Online (Sandbox Code Playgroud)