DB Migrations更新数据库命令
在项目迭代的过程中,数据库结构常常需要跟随业务需求的变化做出调整,尤其在迭代的初期阶段,加一个字段减一个字段的需求更是家常便饭。在小型团队中,往往是负责开发功能模块的程序员在完成本地开发环境数据库的变更后,直接到生产环境中更新数据库结构。
这样的工作方式虽然看起来很轻松,但却可能给你的团队带来不小的麻烦。
首先,是团队成员之间数据库环境的同步问题。为了使团队中的其他开发者及时了解数据库环境的变化,你不得不在每一次修改数据表结构后,都告知整个团队你对当前数据库所做的变更,并确保所有人正确更新了他们开发环境中的数据库。
另外,变更数据库的程序员还需要同时对可能存在几个环境负责,如测试环境,项目展示环境(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+时间戳,内容由up和down两个方法组成,以便数据库可以在多个版本之间自由切换。另外,Doctrine Migrations数据库操作的方法由Doctrine DBAL提供,详细用法查阅Doctine DBAL文档即可。
实现原理
执行 migrations:generate 时,Doctrine Migrations 会在当前环境的数据库中创建一张数据表用于保存当前数据库的版本。当执行 migrations:migrate 时, 工具会在其目录中查找是否有更新的脚本,如果有则执行它。
最后,使用Migrations工具维护数据库版本最重要的一点在于 永远不要手动修改数据库中的表结构。其实在很多开发框架(如:Symfony,Laravel)中,都集成了DB Migrations工具,利用这样的工具,我们能够以脚本化的方式来管理数据库的变化,并且将这些变化纳入到代码版本控制中。当我们将新的代码同步到其他环境时,我们只需要在更新代码后执行Migration脚本,就能将这次提交内产生的数据库变换同步到当前环境中。甚至我们可能并不需要手动来执行这行命令,在发布项目后,项目构建工具会自动帮助我们执行命令,把数据库更新到最新的版本。
DB Migrations更新数据库命令的更多相关文章
- C# Entity Framework 更新数据的三种方法
例: 实体类: public class TestDbContext : DbContext { public DbSet<Test> Tests { get; set; } public ...
- koa 基础(二十四)封装 DB 库 --- 新增数据、更新数据、删除数据
1.根目录/module/db.js /** * DB库 */ var MongoClient = require('mongodb').MongoClient; var Config = requi ...
- MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本
介绍MongoDB支持的一些高级功能: 数据库命令 固定大小的集合 GridFS存储大文件 MongoDB对服务端JavaScript的支持 数据库命令 命令的原理 MongoDB中的命令其实是作为一 ...
- MongoDB学习笔记-数据库命令
概念 数据库命令(database command)是一种非常特殊类型的查询.文档的创建.更新.删除及查询都属于数据库命令的范畴,它还包含管理性的任务(比如关闭服务器和克隆数据库).统计数据及执行聚合 ...
- 使用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 ...
- MongoDB 数据库命令
数据库命令 连接成功后,默认使用test数据库 查看当前数据库名称 db 查看所有数据库名称,列出所有在物理上存在的数据库 show dbs 切换数据库,如果数据库不存在也并不创建,直到插入数据或创建 ...
- 【Mongodb教程 第十七课 】MongoDB常用命令 数据库命令 集合操作命令
(1)数据库命令 a)添加用户 db.addUser(‘name’,’pwd’) b)删除用户 db.removeUser(‘name’) c)用户验证 db.auth(‘name’,’pwd’) d ...
- flask+sqlite3+echarts3+ajax 异步更新数据
结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...
- Android 数据库管理— — —更新数据
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...
随机推荐
- 转:Maven项目中获取classpath和资源文件的路径
假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么java文件夹和resources文件夹在运行时就是class ...
- setTimeout改变this指向(****************************************)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- C# DBHelper类
class DBHelper { //public static string connstr = "server=.;database=SuperKTV;uid=sa;pwd=123456 ...
- hdu2102 BFS
这是一道BFS的搜索题目,只是搜索范围变为了三维.定义数组visit[x][y][z]来标记空间位置,x表示楼层,y和z表示相应楼层的平面坐标. #define _CRT_SECURE_NO_DEPR ...
- 利用mvn/maven如何检查依赖冲突,并解决依赖冲突
mvn/maven如何检查依赖冲突,并解决依赖冲突 如图,点击图示位置,就可以把整个项目的依赖关系展示出来 在图里选中一个artifact,则所有依赖该artifact的地方都会一起连带出来突出显示, ...
- 谈谈ssrf
一.ssrf,全称:Server-Side-Request-Forgery服务端请求伪造 二.我们正常发出的请求都是经过我们的浏览器,由我们自己的电脑发出的:而存在ssrf的目标网站,我们输入某个网址 ...
- C#反射获取属性值和设置属性值
/// /// 获取类中的属性值 /// public string GetModelValue(string FieldName, object obj) { try { Type Ts = obj ...
- mongodb分片片键的选择(持续更新中)
首先要了解项目的情况,检查使用情况 对集合进行分片时,要选择一个或者两个字段拆分数据,这个键叫做片键 一旦拥有对个分片,在修改片键几乎是不肯能的事情,因此选择合适的片键是非常重要的. 对集合分片之前要 ...
- 一波三折ST-Link
前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...
- MongoDB基本文件操作
MongoDB中主要的文件操作有put.get.list.search几种.能够非常方便地进行文件存储于查找,下面是一个简单的演示样例. 1.利用dd命令生成要求大小随机文件 2.使用put命令将生 ...