Rails数据库迁移错误:关系已存在

时间:2012-11-30 07:29:33

标签: ruby-on-rails ruby-on-rails-3 rake dbmigrate

我尝试迁移数据库时出错。我不完全记得我是怎么来到这里的,但我相信我:

  1. 创建新分支,搭建'请求',db:迁移,切换回主分区,合并分支
  2. 创建了另一个分支,做了一些东西,db:迁移,一切正常。
  3. 从heroku postgres数据库中提取,这样我就可以测试一下事情是否适用于实际数据。然后尝试了db迁移,但给了我这个错误:

    rake db:migrate
    ==  CreateRequests: migrating =================================================
    -- create_table(:requests)
    NOTICE:  CREATE TABLE will create implicit sequence "requests_id_seq1" for serial column "requests.id"
    rake aborted!
    An error has occurred, this and all later migrations canceled:
    
    PG::Error: ERROR:  relation "requests" already exists
    : CREATE TABLE "requests" ("id" serial primary key, "title" character varying(255), "content" text, "category" character varying(255), "status" character varying(255), "requested_track_id" integer, "created_at" timestamp, "updated_at" timestamp) 
    
  4. 有什么想法吗?

2 个答案:

答案 0 :(得分:4)

我不确定你使用什么拉动策略,但是如果我们对你的拉动策略做出两个合理的假设:

  1. 它不会删除数据库,只会覆盖表,因为这需要较少的权限。
  2. 它以某种“归档模式”运行,这意味着它不会仅仅因为它们在源上不存在而丢弃目标。想想rsync;您必须指定--delete才能获得该实用程序的预期行为。
  3. 如果你的步骤是正确的,那么你发生了什么是覆盖了schema_migrations表,所以Rails认为你还没有添加表,但是由于上面的#2,你的heroku也没有删除表。

    不要创建另一个迁移!!! 除了你的计算机之外,这将在所有人的计算机上失败,但只会在你的计算机上运行一次。

    相反,运行rails dbconsole并执行类似DROP TABLE 'requests'的内容(我忘记了postgres语法,可能不是那样)。然后,您可以运行迁移。

答案 1 :(得分:3)

还有另一种方法可以避免丢弃包含数据的表。

在这些情况下,我要做的是检查哪个迁移失败。

假设您有一个文件db/migrate/20130908214222_create_requests.rb,由于某种原因,ActiveRecord过去在将此迁移存储在其跟踪系统中时失败了。

为了确保这种情况,只需在schema_migrations表中找到一个包含如下例子的数字的行:20130908214222

如果该行不存在,则只需插入一行:

INSERT INTO schema_migrations(
    version
) VALUES (
    20130908214222
);

下次运行rake db:migrate时,ActiveRecord将省略此步骤,并将继续迁移到最终而不会出现问题。