新手问题 在 migrate 时候很容易遇到 table already exist

jossjoss54 · 2014年09月26日 · 最后由 jossjoss54 回复于 2014年10月02日 · 2736 次阅读

每次在 migrate 的时候很容易遇到 table already exist 知道删除该张 table 就可以解决 有没有办法判断所有的栏位是否相同,若相同则不更新,不同则更新? 或是大家都怎么处理? 要用人工判断挺麻烦的!

  1. 跪求带上头像。要不感觉很丑。

  2. 这个问题出现的原因难道楼主直接修改 migrate 文件?

Rails Migration 没有理解到,自己再研究一下文档:

http://guides.ruby-china.org/active_record_migrations.html

似乎是 merge 後就容易出現這玩意兒,頭像還要找找

主要是因為 schema_migrations 這個 table 沒有更新到,不知道為啥,所以很弔詭

merge 的时候,如果出现 schema 文件冲突,重新跑一遍rake db:migrate 即可。

schema 那个文件我一般都不加到代码库里

@badboy schema 不加到代码库里面,那么 test 文件的 in-memory DB 如何产生相应的 table structure?

@yijunlin 不管你测试环境还是生产环境,都得执行 migrate 啊。。。

从来没有遇见过。楼主给个例子怎么重现错误吧。

@badboy

你说的情况可能只适用于本地 dev 环境或者 prod 环境的测试,因为有对应的数据库产生来临时的 schema 文件,从而生成 in-memory DB。但是如果使用 remote build 系统,那么远程的 host 是不会有数据库连接的,那么在 build 的时候就找不到 schema 文件,无法进行测试。

其次,测试用的 SqlLite 的数据库有一些自己特别的限制,比如 index name 必须 unique。如果由本地数据库(如 MySql)产生的 schema 存在重复的 index name,那么 SqlLite 无法直接读入 schema 进行测试,每个 developer 都需要手动来改动 schema 文件,很浪费时间(发生在身边很多次)。

再着就是会发生楼主所说的情况,可能 migration 相互有冲突,无法依次执行 migration 来建立 DB,这时候一个比较简单的办法就是利用 schema 直接产生没有 data 的本地数据库。所以,schema 文件一般是要 check in 的。

@jossjoss54 你是在运行 migrate 时总遇到 table already exist 么?要么你们的 migration 文件不 consistent,要么你的本地数据库和远程数据库曾经进行过 sync 一部分 table,但是对应的 schema_migrations 表没有 sync。 有没有办法判断所有的栏位是否相同,若相同则不更新,不同则更新?是什么意思?你想要机器自动判断 table 是否一致自动运行 migration 么?

#10 楼 @yijunlin 1.原因还在查明中 2.是我在下 db:migrate 时,若是 table 有不同再 insert,但是这应该要一个 table 一个 table 改,有点费事,有其他方法吗?例如改个参数之类的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号