各种数据库都有交互式工具,简单易用。
学习 rails 可以避开 migration,不用记忆那些命令。
唯一的好处是可以移植,一般谁会需要移植呢?
根据回复,补充一下,还有个好处是多人分布式开发,方便同步数据。
@chenge 你不爱用 migration 可以用 datamapper 代替 activerecord, migration 和交互工具都不需要了。
只是数据库的演化往往不是简单的把 sql 放版本控制就能搞定的。等到你以后碰到实际问题,自己重造出一套 migration 工具后,就会理解为什么有 migration. 等你 migration 写多了,就会理解为什么要专门为此设计一套 dsl...
migration 这么好用的 DSL,难道不比直接写 sql 简单很多吗,构建这个省心省力的好工具就是为了从繁琐的 sql 语句中解脱,加上多人协作时同步数据库操作,不然你改了数据库的某个表,某个字段别人不知道咋办
@chenge 并行开发的话,用 migrate 只要维护一套程序代码就好了,如果用 SQL 脚本,还要去再做一套维护,何其麻烦,还容易混乱,我学 rails 时候倒没觉得在 migrate 上卡过,这不至于成为学习门槛吧,至于快乐和难度成反比。。。。。那极端快乐不就是植物人了么,完全无脑了
As a complete newbie I have to say that migration is so much better and easier than raw SQL. I won't comment on GUI SQL tools. They are not for developers.
使用 migration 可以帮你很轻松解决以下问题
这些都不是命令行,交互工具能实现的
@chenge migration 是非常好的方法, 1.可以对 migration 进行版本管理 2.自动判断哪些 migration 脚本执行过,哪些没执行,没执行的按顺序执行,用脚本不好控制顺序 3.部署在多个地方的时候很方便,每个人有自己的开发数据库,测试组有测试用的多个数据库,产品数据库都能执行,否则每次人工找哪些脚本没执行过非常累 4.migration 可以执行 ruby 代码,可以调用 model 中的方法,这样一些修复数据的逻辑可以既作为维护工具,也可以在 migration 中调用,对新增加的字段特别重要 。。。好处太多了,现在看一个框架首先看有没有好的 migration 方案
就我的项目而言,真不知道没有 mgiration 我会怎么活。曾经想换个框架,但一想到没有 migration 这个东西,顿时没有了躁动。 mingration 有那些作用呢? 1.你有三个开发人员,如果数据库里要增加一个列,你需要用 gui 工具做三次,每个人要做的一样。当代码测试好,你要发布代码的时候,你还要用 gui 改一次。如果两天之内改了两个列,涉及三张表,部署生产环境的如果不是你,请问你安排谁来做? 2.数据库里已经有数据了,新修改了一些列的定义后,要做数据的清洗,还是三个开发人,每个人的测试数库都有些小变化,你怎么去给三个人更新他们的测试数据。另外,原来有一列是用 md 加密的数据,新算法换成 sha1 了,你用 sql 怎么做数据转换?
数据备份保证安全,万一出错可以恢复。
我们的做法两个人共用一个数据库,开发==部署,当然不会有大的修改。
#37 楼 @zj0713001 目前只有操作测试,没别的 spec 测试。
我一再说要看项目的情况。
migration 可以 commit 到版本库,可以保证 db:migrate
之后的结果是一致的,这是多么舒服的一种情况啊。
在开发中好处和效果都很明显,就算是几个人的小团队,我加了一列,还要给你讲一下,你自己再开个图形界面工具自己再加一列,万一一个人这两天休假了,过两天回来了,他要在 5 个表里删 8 列加 7 列,实在不行只能再导出一份.sql 导进去,这时候可能他休假前加的两列就没了...这简直是...hell, never want to go back to that again.
@zj0713001 GUI 工具我都有,但是一般不用,因为长时间不用都不会用了,用也是打开命令行面板写代码,主要是长时间不用,基本不会用了,还有很重要一点就是,GUI 没法 google 出解决方案啊,命令行的好找多了
@chenge 萝卜白菜各有所爱,存在即合理,如果楼主觉得 GUI 好用,就继续用 GUI 挺好的,等到真正觉得需要用 migration 的时候再用也可以,没有必要为了一个工具而用一个工具,用适合自己的。
lz 这样比较适合小项目,真正的线上生产环境,migration 是很有必要的,特别是在多次迭代的时候,数据库的变化也是需要控制和追踪起来的,migration 做的正式这些事情。
楼主肯定没有真刀真枪的玩过 我们项目几年内对数据库的修改达到上千次 没有 migration 的结果就是你不知道别人修改了数据库,当然别人也不会通知你,直到出错以后才找一个勉强能解决问题的数据库脚本跑一跑,如果没出错就不跑了。经过几个月几年的时间和正式数据库的差距越来越大,最后发现出了问题跑脚本也是错误一大堆,才会意识到当中其实漏跑过很多脚本了。但是由于时间长久,记不清了,因此这个库最终无法修复了。这就是没有 migration 的结果。。。
还有原理问题,它是依赖文件名上的时间吧,如果多人的机器时间不一致,会有问题吗?
你不知道依赖时间戳的作用是什么?本来要的就是不一样,时间戳就是为了避免产生同名不同源的 migration 产生,不一样就对了。当然,你可以反过来说“难道就能保证不出现一样的?”,那我就没啥可说的了,没人可以保证任何事情,Migration 不算完美无缺,但是它一直在进步,所有现在觉得理所当然的事情在一开始都会被人质疑,能够阻挡它前进的既不是你,也不是我们之中的任何人,只有它自己。
migrate 最大的好处就是用统一的规范,低成本(对开发人员来说,低成本就是便利)地让各个环境(生产、测试、开发、个人)的数据库达到一致。 没有它之前,每个环境的人都得去检查是否有人更新数据库了,如果有,就复制粘贴执行,再打上自己的标志,这么多步骤难道不复杂吗?比起记一个命令真的是复杂麻烦多了。 至于楼主觉得 dsl 有一定的学习曲线,增加学 rails 的难度,那可以直接把原生的 sql 复制到 migration 脚本中,使用 migrate 执行即可,这样即可以不用让人去学习 dsl,又可以用上 migrate 的好处。 不用 dsl,我认为在多数项目中都是可行的,毕竟有几个项目会在中途更换数据库呢?