在项目迭代的过程中,数据库结构常常需要跟随业务需求的变化做出调整,尤其在迭代的初期阶段,加一个字段减一个字段的需求更是家常便饭。在小型团队中,往往是负责开发功能模块的程序员在完成本地开发环境数据库的变更后,直接到生产环境中更新数据库结构。

这样的工作方式虽然看起来很轻松,但却可能给你的团队带来不小的麻烦。

首先,是团队成员之间数据库环境的同步问题。为了使团队中的其他开发者及时了解数据库环境的变化,你不得不在每一次修改数据表结构后,都告知整个团队你对当前数据库所做的变更,并确保所有人正确更新了他们开发环境中的数据库。

另外,变更数据库的程序员还需要同时对可能存在几个环境负责,如测试环境,项目展示环境(UAT)等都需要一一进行更新,靠人手动去维护成本高,速度慢,并且容易出错。在持续交付已经逐渐成为软件开发标准流程的今天,再继续这样的做法实在不够敏捷的。

不过幸运的是,现在我们已经有了成熟的方案来应对这样的麻烦。既然我们可以通过版本控制的方式让代码同步变得更加轻松,那为什么我们不用同样的方式来管理数据库的变更呢?这就是 Database Migrations。下面我将以Doctrine Migrations为例,来说明我们应当如何解决这样的问题。

  • 安装

    composer require doctrine/migrations

    Doctrine Migrations 提供了两种调用方式供你选择。一个是注册命令行工具, 另外,你也可以选择直接使用 Doctrine Migrations可执行文件(.Phar)migrations.phar 默认会从当前目录下的 migrations-db.php 中读取数据库配置文件。

  • 常用命令

    migrations:generate //生成变更脚本文件
    migrations:migrate //更新到最新版本
    migrations:migrate prev //回滚到前一个版本
    migrations:migrate YYYYMMDDHHMMSS //更新到指定版本

    生成脚本的文件名格式为Version+时间戳,内容由 updown两个方法组成,以便数据库可以在多个版本之间自由切换。另外, Doctrine Migrations 数据库操作的方法由 Doctrine DBAL 提供,详细用法查阅 Doctine DBAL 文档即可。

  • 实现原理

执行 migrations:generate 时,Doctrine Migrations 会在当前环境的数据库中创建一张数据表用于保存当前数据库的版本。当执行 migrations:migrate 时, 工具会在其目录中查找是否有更新的脚本,如果有则执行它。

最后,使用Migrations工具维护数据库版本最重要的一点在于 永远不要手动修改数据库中的表结构。其实在很多开发框架(如:Symfony,Laravel)中,都集成了DB Migrations工具,利用这样的工具,我们能够以脚本化的方式来管理数据库的变化,并且将这些变化纳入到代码版本控制中。当我们将新的代码同步到其他环境时,我们只需要在更新代码后执行Migration脚本,就能将这次提交内产生的数据库变换同步到当前环境中。甚至我们可能并不需要手动来执行这行命令,在发布项目后,项目构建工具会自动帮助我们执行命令,把数据库更新到最新的版本。

DB Migrations更新数据库命令的更多相关文章

  1. C# Entity Framework 更新数据的三种方法

    例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public ...

  2. koa 基础(二十四)封装 DB 库 --- 新增数据、更新数据、删除数据

    1.根目录/module/db.js /** * DB库 */ var MongoClient = require('mongodb').MongoClient; var Config = requi ...

  3. MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本

    介绍MongoDB支持的一些高级功能: 数据库命令 固定大小的集合 GridFS存储大文件 MongoDB对服务端JavaScript的支持 数据库命令 命令的原理 MongoDB中的命令其实是作为一 ...

  4. MongoDB学习笔记-数据库命令

    概念 数据库命令(database command)是一种非常特殊类型的查询.文档的创建.更新.删除及查询都属于数据库命令的范畴,它还包含管理性的任务(比如关闭服务器和克隆数据库).统计数据及执行聚合 ...

  5. 使用django执行数据更新命令时报错:django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency users.00 01_initial on database 'default'.

    如果在重新封装更新用户表之前,已经更新了数据表,在数据库中已经有了django相关的依赖表,就会报错: django.db.migrations.exceptions.InconsistentMigr ...

  6. MongoDB 数据库命令

    数据库命令 连接成功后,默认使用test数据库 查看当前数据库名称 db 查看所有数据库名称,列出所有在物理上存在的数据库 show dbs 切换数据库,如果数据库不存在也并不创建,直到插入数据或创建 ...

  7. 【Mongodb教程 第十七课 】MongoDB常用命令 数据库命令 集合操作命令

    (1)数据库命令 a)添加用户 db.addUser(‘name’,’pwd’) b)删除用户 db.removeUser(‘name’) c)用户验证 db.auth(‘name’,’pwd’) d ...

  8. flask+sqlite3+echarts3+ajax 异步更新数据

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

  9. Android 数据库管理— — —更新数据

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

随机推荐

  1. Andriod Atom x86模拟器启动报错

    用Inter Atom模式的Android模拟器启动报一下错误: Starting emulator for AVD 'new' emulator: ERROR: x86 emulation curr ...

  2. dedecms调用新闻文章列表

    效果如下: 代码如下: <div class="list"> <ul class="d6 ico4"> {dede:list pages ...

  3. Web.config配置文件详解(新手必看) 【转】

    来源 :http://www.cnblogs.com/gaoweipeng/archive/2009/05/17/1458762.html 花了点时间整理了一下ASP.NET Web.config配置 ...

  4. 转: 使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)

    from:  http://www.cnblogs.com/hdwang/p/5418747.html

  5. winform程序公布后,client下载报错“您的 Web 浏览器设置不同意执行未签名的应用程序”

    如题 在winserver2008服务器上操作会报错.解决的方法: IE→Internet选项→安全→可信网站,加入信任公布的IP地址

  6. WPF 基础到企业应用系列5——WPF千年轮回 续前缘

    一.摘要 首先非常高兴这个系列能得到大家的关注和支持,前端时间身体状况不适,所以暂停了更新,对此表示非常抱歉,以后会逐渐加快进度.只是因为这是一个非常长的系列,我也想把它写好,所以以后也会慢慢来,在这 ...

  7. JSBridge深度剖析

    概述 做过混合开发的人都知道Ionic和PhoneGap之类的框架,这些框架在web基础上包装一层Native.然后通过Bridge技术的js调用本地的库. 在讲JSBridge技术之前.我们来看一下 ...

  8. [转载]UDP丢包率提升

    UDP丢包及无序问题 转载自:http://hi.baidu.com/gamedot/item/96cb9bf1a717eb14d6ff8cd5 最近在做一个项目,在这之前,做了个验证程序. 发现客户 ...

  9. OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法

    <span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray a ...

  10. RF常用库简介(robotframework)

    标准库 Robot Framework可以直接导入使用的库,包括: Builtin:包含经常需要的关键字.自动导入无需import,因此总是可用的 Dialogs:提供了暂停测试执行和从用户的输入方式 ...