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

8

我在尝试迁移我的数据库时出现了错误。我不完全记得我是如何到达这里的,但我相信我:

  1. created new branch, scaffolded 'Requests', db:migrated, switched back to master, and merged branch
  2. created another branch, did some stuff, db:migrated, and everything was working fine.
  3. pulled from heroku postgres database so i could test out if things worked with actual data. then tried db migrating, but gave me this error:

    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) 
    
有什么想法吗?

1
创建隐式序列的消息不是错误,而只是通知(一条信息性消息)。这对于使用自增列的任何表格来说都是正常的,默认情况下,活动记录将为“id”列执行此操作。错误在于“requests”表已经存在。 - qqx
那么如果我收到这个消息,我该怎么办?我通过创建迁移来删除表,然后重新创建一个迁移来创建相同的表来解决了这个问题。有更好的方法吗? - kibaekr
1
你的数据库架构将是所有分支的净结果,假设环境相同。在合并分支之前,你的代码不一定会显示已经在底层数据库上发生的迁移系列。而且,当你运行迁移时,对于先前的迁移的检查只会针对当前的迁移进行,这可能会导致潜在的冲突。我建议将所有迁移都保留在一个分支中。 - Carson Cole
2个回答

5

我不确定您使用了哪种拉取策略,但如果我们对您的拉取策略做出两个合理的假设:

  1. 它不会删除数据库,只是覆盖表,因为这需要较少的权限。
  2. 它在某种“归档模式”下运行,这意味着它不会仅因为源中不存在而删除目标上的表。想想rsync;您必须指定--delete才能获得该实用程序的预期行为。

如果您的步骤正确,则发生的是您覆盖了schema_migrations表,因此Rails认为您尚未添加该表,但也没有因为上述#2而从heroku拉取删除该表。

请不要创建另一个迁移文件!!!这会在除您之外的所有人的计算机上失败,但仅在您的计算机上运行一次。

相反,请运行rails dbconsole并执行类似于DROP TABLE 'requests'的命令(我忘记了postgres语法,可能不是完全这样)。 然后您就可以运行您的迁移。


4

有另一种方法可以避免删除带有数据的表。

在这种情况下,我所做的是检查哪个迁移失败了。

假设您有一个名为db/migrate/20130908214222_create_requests.rb的文件,并且由于某些原因,ActiveRecord在过去存储此迁移时失败了。

为确保这是正确的情况,请在schema_migrations表中找到包含类似于此示例的数字的行:20130908214222

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

INSERT INTO schema_migrations(
    version
) VALUES (
    20130908214222
);

下次运行rake db:migrate时,ActiveRecord将省略此步骤,并在没有复杂性的情况下继续迁移到结束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接