如何为 PHP/MySQL 应用程序自动迁移(架构和数据)

2022-08-30 17:14:35

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

我读过杰夫K.斯科特艾伦关于这个问题的文章。

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

有没有简单而好的流程?


答案 1

我有一个我使用的“Schema”对象 - 但你可以在没有类的情况下做同样的事情。

您要做的是创建一个“”表:db_schema_versions

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

在您的数据库可以跟踪它所在的版本 #之后,它可以自动执行 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

答案 2

与gnarf的建议类似,我会用以下内容运行:

  • 对于架构的每次更改,都会创建一个 SQL 文件,该文件在运行时会将您从旧版本带到新版本(这可能是每个主要版本一个文件,也可能是许多较小的更改)。
  • 创建一个单独的文件,按必须应用的顺序列出每个 SQL 文件名(最旧在顶部,最新在底部)
  • 在数据库中创建一个简单的“版本控制”表(它所需要的只是一个 VARCHAR 列)

现在,您需要编写一个简单的脚本,该脚本的工作方式如下:

  • 在版本控制表中查询上次应用的 SQL 更新文件的名称
  • 如果有较新的SQL更改文件要运行,请按顺序执行它们
  • 记录应用的最新 SQL 文件的名称

我希望这是有道理的


推荐