持续集成和数据库管理

Cod*_*key 11 database svn continuous-integration

在与其他几个人一起开展项目时,通常有几个人具有不同的区域,例如数据库.

我的挑战是如何让几个人在持续集成环境中编辑数据库模型.

开发人员建议编写"版本控制脚本",其中每个编辑都输入到.sql脚本中,其中包含数据库能够检测到的版本号.模型的新增内容将在此文件中标记一个版本,并且一旦提交了脚本并运行了构建,就会更新数据库.

我也听说过Publisher/Subscriber ......并且读了一下它.

您如何在日常工作中管理这种情况,以及您可以给我什么建议让数据库更改尽可能无缝地运行?

**编辑**

已经提到了迁移框架和迁移脚本.如果您有一些实践经验并建议一个框架,那也将不胜感激.

Pas*_*ent 21

引用杰夫阿特伍德在版本控制下的优秀获取数据库帖子:

...

我正在考虑这个问题,因为我的朋友兼合着者 K. Scott Allen刚刚撰写了关于数据库版本控制的理念和实践的精彩的五部分系列文章:

  1. 数据库工作的三条规则
  2. 基线
  3. 更改脚本
  4. 视图,存储过程等
  5. 分支和合并

...

真的,即使很多人似乎对第3部分特别感兴趣,整个系列也值得一读.顺便说一句,看看第三部分提到的使用INFORMATION_SCHEMA Views文章的Bulletproof Sql Change Scripts.您可能已经意识到这一点,但它解释了为什么编写幂等更改脚本很重要.

关于工具,您可能需要查看UpToDater(以代码为中心),LiquiBase(基于xml)或... dbdeploy,这是一个基于ThoughtWorks软件开发实际经验的小宝石.这不是第一个不好,但这个是我的首选(并且可用于Java,PHP或.NET).

  • 如果我不仅限于1个upvote,那么我会将这18次投票:D (2认同)

wor*_*ad3 6

我倾向于使用"迁移"脚本发挥最佳功能,这是从简单的版本化脚本开始的下一个阶段.通过迁移,您可以指定对数据库的更改(添加,删除等)以及如何撤消迁移所执行的更改.然后使用某种形式的版本对其进行标记,该版本不会与其他开发人员发生冲突.一个特别好的版本号是当前时间(以YYYYMMDDHHMMSS格式或从纪元开始的秒数).这是一个不错的选择,因为你不太可能得到版本冲突,并且由于这些时间戳的严格增加性质,仍然很容易看到是否存在新版本.

注意:这很大程度上受Rails中迁移系统的影响.有关更多详细信息和想法,我强烈建议您查看该系统.

Rails迁移:

class CreateGroups < ActiveRecord::Migration
  def self.up
    create_table :groups do |t|
      t.string :name
      t.references :owner

      t.timestamps
    end
  end

  def self.down
    drop_table :groups
  end
end
Run Code Online (Sandbox Code Playgroud)

学说迁移:

class CreateGroups extends Doctrine_Migration
{
    public function up()
    {
      // Create new author table
      $columns = array('id'   => array('type'          => 'integer',
                                       'length'        => 4,
                                       'autoincrement' => true),
                       'name' => array('type'          => 'string',
                                       'length'        => 255),
                       'owner_id' => array('type' => 'integer',
                                            'length' => 4));

    $this->createTable('groups', $columns, array('primary' => array('id')));
    }

    public function down()
    {
    $this->dropTable('groups');
    }
}
Run Code Online (Sandbox Code Playgroud)

(对不起,缺乏学说时间戳的......在轨道中的时间戳呼叫created_at和的updated_at字段被自动为您管理的表补充说.我不知道在教义类似的行为,所以我离开了出来).