PHP - 数据库模式:版本控制、分支、迁移

2024-02-28

我正在尝试提出(或找到)一个可重用的系统,用于 php 项目中的数据库模式版本控制。

有许多可用于 php 的 Rails 风格的迁移项目。http://code.google.com/p/mysql-php-migrations/ http://code.google.com/p/mysql-php-migrations/就是一个很好的例子。它使用迁移文件的时间戳,这有助于解决分支之间的冲突。

此类系统的一般问题:当开发分支 A 被签出,并且您想要签出分支 B 时, B 可能有新的迁移文件。这很好,迁移到更新的内容是直接的。

如果分支 A 有较新的迁移文件,则需要向下迁移到最近的共享补丁。如果分支 A 和 B 的代码库显着不同,您可能需要进一步向下迁移。这可能意味着:签出B,确定共享补丁号,签出A,向下迁移到该补丁。这必须从 A 完成,因为实际应用的补丁在 B 中不可用。然后,签出分支 B,并迁移到最新的 B 补丁。从 B 到 A 时再次进行相反的过程。

提议的系统:向上迁移时,不只是存储补丁版本,而是在数据库中序列化整个补丁以供以后使用,尽管我可能只需要 down() 方法。 更改分支时,将已运行的补丁与目标分支中可用的补丁进行比较。通过 ID 或哈希确定运行补丁的数据库表与目标分支中的补丁之间最近的共享补丁(或者可能是最旧的差异)。还可以查找隐藏在两个分支之间的许多共享补丁下的新补丁或丢失补丁。

使用数据库表存储的 down() 方法自动向下合并到最近的共享补丁,然后向上合并到分支的最新补丁。

我的问题是:这个系统是否太疯狂和/或充满后果而懒得开发?我在数据库模式版本控制方面的经验仅限于 PHP autopatch,这是一个仅限 up() 的系统,需要具有顺序 ID 的文件名。

更新,2年后

这是一篇旧文章,但我想提一下,我在开发过程中通常放弃了迁移,因为它们不必要地复杂且容易出错。

相反,我使用构建脚本来:

  1. 清除数据库,
  2. 创建架构,
  3. 添加已知的应用程序数据(真实内容),以及
  4. 添加夹具数据(开发内容)。

当更改分支或接收其他开发人员的更新时,您可以使用一个命令完全重新加载数据库以达到已知状态。

生产服务器仍然需要数据库补丁,但无论如何都必须手动创建这些补丁。


好吧,我找不到任何理由不继续前进。

该项目如下:

http://github.com/Billiam/MySQL-PHP-AutoMigrations http://github.com/Billiam/MySQL-PHP-AutoMigrations

需要一些爱(准确的评论、单元测试、实际的错误测试),但现在似乎对我来说效果很好。

这是一个叉子http://code.google.com/p/mysql-php-migrations/ http://code.google.com/p/mysql-php-migrations/包括上面的想法,以及其他一些小东西。

向下迁移是通过向上迁移时保存在数据库中的方法完成的,因此文件更改(如在分支之间切换时的更改)不会影响向下迁移。 添加了两个功能:

  • 一个神奇的“自动”功能,可以处理向下迁移到最旧的共享迁移,然后向上迁移到迁移目录中的最新迁移。
  • “提议”功能显示 auto 将实际执行的操作。

Still very然而,对于这种方法潜在的(甚至预期的)陷阱持开放态度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP - 数据库模式:版本控制、分支、迁移 的相关文章

  • 从 PHP 执行 SQL Server 存储过程

    我尝试从 PHP 调用 SQL Server 存储过程 这是我的存储过程 CREATE procedure dbo tester id NVARCHAR MAX AS BEGIN DECLARE tab TABLE myxml XML IN
  • 如何使用 PHP 创建动态页面标题

    大家好 我想知道是否有人可以帮助解决这个 PHP 问题 是否可以使用 H2 标记中的文本并使用它来动态填充页面标题 我还希望能够使用相同的技术将 H2 文本添加到元描述中 有人可以帮忙吗 如果您的 h2 文本是动态创建的 那么网页的其他部分
  • PHP7 返回类型为 JSON

    PHP 7 有一个新功能 即返回类型声明 我们可以返回一个 字符串 类型 例如 function myFunction a string 我们还可以返回一个 数组 类型 例如 function myFunction a array 但是我们
  • .Net 将 NULL 值从变量值插入 SQL Server 数据库

    也有类似的问题 但答案不是我想要的 如果引用为 NULL 或尚未分配值 我想将 NULL 值插入 SQL Server 数据库 目前我正在测试 null 它看起来像 String testString null if testString
  • 创建用于插入、修改和删除的数据库触发器的正确​​语法是什么

    我有一个看起来像是 SQL Server 中数据库触发器的基本场景 但我遇到了一个问题 我有桌子Users 身份证 姓名 电话等 我有桌子用户历史记录 id user id 操作 字段 时间戳 我想要一个数据库触发器 可以随时插入 更新或删
  • 在 django 中创建“历史”类型模型的最佳方法是什么?

    我想为我的 Django 应用程序创建一个类似于 Django 管理员的 最近操作 的功能 以便存储其他模型的历史信息 例如 假设我有两个模型 分别称为 Book 和 Author 我想要第三个模型来存储信息 例如由谁以及何时对模型中的给定
  • PDO 如何在执行 rollBack() 函数之前回滚查询?

    这是我的脚本 try dbh con gt beginTransaction stmt1 dbh conn gt prepare UPDATE activate account num SET num num 1 stmt1 gt exec
  • php简单xml如何读取具有不同子节点级别的多个节点

    我有一个 xml 文件 其中包含不同的命名节点和多级子节点 每个节点之间都不同 我应该如何访问数据 需要很多嵌套的for循环吗 以下是 xml 代码示例
  • Laravel 5 Eloquent 关系:无法修改/覆盖关系表属性

    我正在使用 Laravel 5belongsToMany使用中间数据透视表定义相关表的方法 我的应用程序正在使用雄辩的模型Tour and 旅游类别 在游览模型中我有 namespace App use Illuminate Databas
  • 仅包含主键和外键的数据库表的用途是什么?

    我试图理解一个简单的音乐数据库设计 有些表只包含外键和主键 我不确定如何以及何时使用这些表或向其中插入什么内容 设计如下 Track id primary key title duration live performance true o
  • 如何在xampp中启用curl

    我面临下面给出的错误 致命错误 在第 11 行调用 E xampp htdocs new functions php 中未定义的函数curl init 我已经做出了改变php ini 我把前面的分号去掉了 extension php cra
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • Laravel 雄辩的 withCount() 应该比 with() 慢

    所以我问这个的原因是在我当前的应用程序中withCount 与仅通过以下方式获取关系的所有数据相比 响应时间几乎增加了三倍with 并只是从前端获取长度 javascript 我认为使用的要点withCount 是为了加快查询速度 但也许我
  • mysqli_connect(): (HY000/2002): 无法建立连接,因为目标机器主动拒绝

    我知道有很多这样的问题 但我没有找到任何解决方案 我尝试过的事情 检查防火墙 重新启动我的电脑和 Apache 服务器 重新启动MYSQL 检查了我的代码 尝试了我所知道的和在互联网上找到的一切 这是我的代码
  • 尝试使用curl进行GET,发送的值允许为空

    我正在尝试使用curl 来执行一个简单的GET 其中包含一个名为redirect uri 的参数 被调用的 php 文件打印出 GET redirect uri 的空字符串 它显示 red 并且似乎没有发送任何内容 执行获取操作的代码 Ge
  • 用于客户端存储和服务器端同步的javascript库[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 javascript 库 它可以让我将数据存储在客户端数据库中 并在后台自动将数据库同
  • PHP strtotime返回Mysql UNIX_TIMESTAMP的不同值

    我在 stackoverflow 上搜索过帖子 发现了一些类似的帖子 但我认为这是一篇不同的帖子 我的 PHP 和 Mysql 服务器的时区全部设置为 UTC 在表中我使用时间戳字段 值为 2010 11 08 02 54 15 我使用这样
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • 正则表达式检查确切的字符串是否存在,包括#

    新问题正如 Asaph 在上一个问题中所建议的 正则表达式检查确切的字符串是否存在 https stackoverflow com questions 2824291 regex to check if exact string exist

随机推荐