Laravel学习笔记(三)数据库 数据库迁移
该章节内容翻译自《Database Migration using Laravel》,一切版权为原作者。
原作者:Stable Host, LLC
翻译作者:Bowen Huang
正文:
Laravel鼓励敏捷、迭代的开发方式,我们没指望在第一次就获得所有正确的。相反,我们编写代码、测试和与我们的最终用户进行交互,并完善我们的理解。
对于工作,我们需要一个配套的实践集。我们使用像subversion、GIT或Mercurial这些版本控制工具来存储应用程序的源代码文件,使我们能够撤消错误和追踪开发过程中的改变。
但应用程序更改时,存在我们不能单独使用版本控制进行有效管理的区域。在我们的开发进度中,Laravel应用程序的数据库架构不断演变:我们在这里添加了一个表,在那里重命名列,删除索引等等。数据库的改变与应用程序代码步调一致。
你需要一个复杂的方法来跟踪您的数据库架构更改,通常有几种方法:
- 当您在开发团队内工作时,每人都需要知道关于任何架构的更改。
- 当你在生产服务器上部署时,您需要有稳健的方式来升级您的数据库架构。
- 如果您在多台机器上工作,你需要保持所有数据库架构的同步。
如果没有严格的约定和纪律让应用程序开发者遵循,保持数据库架构与应用程序代码同步历来是一个非常麻烦的工作。开发者(或数据库管理员) 进行所需的架构更改。但是,如果应用程序代码回滚到以前的版本,但是很难撤消数据库架构更改,照成数据库版本信息与应用程序代码版本信息不一致。
迁移就是帮助你进化你的应用程序数据架构的Laravel方式,它不需要你在每次改变的时候删除或者重建数据库。没有删除和重建就意味着你不会在每次改变的时候丢失数据。当你执行迁移时唯一的改变就是将数据库架构从一个版本移到另一个版本,不管是向前还是向后移。
Laravel迁移给你提供了一种在迭代方式中修改数据库架构的手段,它不要你用SQL操作,而是允许你使用PHP代码。Laravel架构生成器允许我们快速创建数据库表和插入列或索引。它使用清洁和富有表现力的语法来操作数据库。你也许为认为Laravel迁移就是数据库的版本控制。
通过定义一个更高级别的接口来创建和维护数据库架构,你可以用与数据库无关的方式定义它。通过使用 PHP 来创建表,定义列和索引,写一次架构并将其应用到任何所支持的数据库后端。额外的好处是 ,Laravel 跟踪已经应用了哪些迁移和哪些仍需要应用。
迁移基础知识
一个Laravel迁移仅仅是你应用程序app/database/migrations目录下的PHP源文件。每个文件都包含了对底层数据库的一组改变。对数据库的改变是在PHP代码中而不是数据库特定的SQL。你的PHP迁移代码最终被转换成符合你当前数据库的DDL,这使得切换数据库平台非常的容易。由于迁移代码保存在自己的目录中,就务必要像其他的项目代码一样包含到版本控制里面。Laravel迁移是使用Artisan工具用命令行显示运行的。
迁移文件命名约定
在旧版本Laravel的,迁移的文件有比较简单的名字,如001_create_employees_table.php 。 Laravel 3(Laravel 4.1和其相同)带来了新的命名约定,其中名称的第一部分从一个序列号变更为更长的时间,像2014_03_11_032903_create_employees_table.php。该文件的名称的形式YYYY_MM_DD_HHMMSS_some_meaningful_name.php的,也就是说一个UTC时间戳识别后跟一个迁移名。
新的更宽的名字有助于避免名称冲突,如果你是工作在一个团队里的一个开发人员,你可以检查自己的迁移。
此外, Laravel迁移文件的时间戳,以便他们可以顺序执行。时间戳数字是迁移的关键,因为它们定义了哪一个迁移应用在独立迁移版本号的顺序。
想SQL脚本,迁移从顶部开始执行,这更加需要这些文件才能被执行。顺序执行移除了类似这样的可能性——在表不存在的时候尝试插入列。
尽管你可以手动创建迁移文件,但是使用Artisan工具生成迁移脚本更加的容易(并且不易出错)。你可以根据需要在以后编辑这些文件。
运行迁移Forward 和 Backward
使用Artisan工具迁移到数据库。Laravel提供了一套artisan任务,可以归结为运行特定的几套迁移。
[注]你可以运行artisan list同查看artisan支持的任务列表,大多数数据迁移相关的任务都带有前缀migrate:。
只有几个你需要知道的常见任务:
- migrate:install
你第一次使用的与迁移有关的artisan任务可能就是migrate:install。在内部,Laravel使用特殊的表来跟踪哪些迁移已经运行。若要创建此表,只需要用artisan命令行工具:
$php artisan migrate:install - migrate
你将会运行migrate任务频繁的更新你的数据库,以支持你添加到应用程序中的最新的表和列。最基本的形式,它只会对那些所有没有被运行过的迁移运行up()方法。如果没有这样的迁移,会退出。它将基于迁移的日期来运行这些迁移。 - migrate:rollback
在写迁移时偶尔也会犯错误。如果你已经运行了迁移,那么你不能只是编辑迁移和再次运行迁移:Laravel假定它已经运行了迁移,那么当你再次运行artisan
migrate,不会做任何事情。你必须使用artisan
migrate:rollback回滚迁移,然后编辑迁移,再运行artisan
migrate去运行正确的版本。
一般情况下,编辑现有的迁移不是好主意:你和你的同事将会需要额外的工作,并且这是一件让人头痛的事——如果现存版本的迁移已经运行在生产机器上。相反,你需要写一个新的迁移去执行所需的改变。
[注]artisan
migrate:rollback 会删除上次的迁移应用。Laravel回去整个迁移“操作”。因此,如果上次的迁移命令运行了15个迁移,这15个迁移都会被回滚。请注意,当你删除列或者表,会丢失数据。
- migrate:reset
回滚所有的迁移(会删掉所有表和数据) - migrate:refresh
artisan migrate:refresh任务将删除数据库、 重新创建它并将加载当前架构。这是一个方便快捷方式去运行重置并随后重新运行所有迁移。 - migrate:make
artisan migrate:make命令告诉
Laravel 来生成一个迁移文件骨架 (这是实际上是一个
PHP 文件) ,存放到app/database/migrations文件夹中。然后,您可以编辑此文件来充实您的表/索引定义。然后,artisan
migrate命令运行时,artisan会查询此文件来生成
SQL DDL 的实际代码。
接下来会详细描述数据库迁移
未完待续……
Laravel学习笔记(三)数据库 数据库迁移的更多相关文章
- laravel学习笔记(三)
模型传值 路由: Route::get('/posts/{post}','\App\Http\Controllers\PostController@show'); 方法: public functio ...
- Laravel学习笔记(三)--在CentOS上配置Laravel
在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚. 今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下. 1)系统 ...
- SQLMAP学习笔记2 Mysql数据库注入
SQLMAP学习笔记2 Mysql数据库注入 注入流程 (如果网站需要登录,就要用到cookie信息,通过F12开发者工具获取cookie信息) sqlmap -u "URL" - ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- iView学习笔记(三):表格搜索,过滤及隐藏列操作
iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...
- openresty 学习笔记三:连接redis和进行相关操作
openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...
- Laravel学习笔记之Session源码解析(上)
说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
随机推荐
- DBN 入门学习资料整理
建议按序阅读 1.Deep Learning 概述 Deep Learning(深度学习)学习笔记整理系列 : http://blog.csdn.net/zouxy09/article/details ...
- MCMC: The Metropolis Sampler
本文主要译自 MCMC: The Metropolis Sampler 正如之前的文章讨论的,我们可以用一个马尔可夫链来对目标分布 \(p(x)\) 进行采样,通常情况下对于很多分布 \(p(x)\) ...
- ionic slidebox 嵌套问题
ionic slidebox 嵌套 会有一个 冒泡 事件 , 即使是 阻止了 父级冒泡也不管用 , 最终 用 滑动 事件on-drag="drag()" 去阻止 了父级的 滑 ...
- 微信公众号开发之被逼学web服务端1-----使用SecureCRT连接Linux服务器
做Android的进新公司后安排做微信公众号开发,这基本是后台和前端的活都要由小白的我来做,这两天基本成鸭子了,被填的满满的,却还是不够,博文仅作记录,希望能给后来的小白一点参考吧 今天做的是如何配置 ...
- [摘抄]iOS App icon、启动页、图标规范
以下内容都是我在做App时通过自己的经验和精品的分析得来的,希望会帮助到你.但是有时个别情况也要个别分析,要活学活用. 一. App Icon 在设计iOS App Icon时,设计师不需要切圆角, ...
- js内存泄露的几种情况
想解决内存泄露问题,必须知道什么是内存泄露,什么情况下出现内存泄露,才能在遇到问题时,逐个排除.这里只讨论那些不经意间的内存泄露. 一.什么是内存泄露 内存泄露是指一块被分配的内存既不能使用,又不能回 ...
- 随机函数的代码(srand、rand)
#include<stdio.h> int main() int counter; for(counter=0;counter<10;counter++) { srand(count ...
- c#-1 数据结构 定义相关 界面交互数据 Model层
1.时间用Nullable<UInt32> 除了最初时间用DateTime TimeSpan不行. 2.其他元素也用Nullable<UInt32> 3.list集合数据绑定类 ...
- 基于XML的AOP配置-转
http://www.cnblogs.com/yangy608/archive/2010/11/14/1876839.html AOP(Aspect-Oriented Programming,面向切面 ...
- 改进:js修改iOS微信浏览器的title
问题简介 前端入门没多久,可能连入门也不算,最近网上流行各自书籍改名,什么<前端开发,从入门到放弃>,<Android开发,从入门到改行>之类的,程序员真是个爱自嘲的群体,但我 ...