【问题标题】:Rails DB Migration Error: relation already existsRails DB 迁移错误:关系已存在
【发布时间】:2012-11-18 09:53:01
【问题描述】:

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

  1. 创建新分支,搭建“Requests”脚手架,db:migrated,切换回 master,合并分支
  2. 创建了另一个分支,做了一些事情,db:migrated,一切正常。
  3. 从 heroku postgres 数据库中提取,因此我可以测试是否使用实际数据。然后尝试数据库迁移,但给了我这个错误:

    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) 
    

有什么想法吗?

【问题讨论】:

  • 关于创建隐式序列的消息不是错误,只是一个通知(信息性消息。对于任何使用自动递增列的表来说,这是正常的,活动记录默认情况下会为id 列。错误是requests 表已经存在。
  • 那么如果我收到该消息该怎么办?我通过创建迁移来删除表来解决它,然后重新创建迁移来创建同一个表。有没有更好的办法?
  • 假设环境相同,您的数据库架构将是所有分支的最终结果。在合并分支之前,您的代码不需要显示在底层数据库上实际发生的一系列迁移。而且,当您运行迁移时,将仅针对当前迁移进行对先前迁移的检查,这将表明潜在的冲突。我建议将所有迁移保存在一个分支中。

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


【解决方案1】:

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

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

如果你的步骤是正确的,那么发生的事情是你覆盖了schema_migrations 表,所以 Rails 认为你还没有添加表,但是你的 heroku 也没有因为上面的 #2 而拉掉表。

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

相反,运行rails dbconsole 并执行DROP TABLE 'requests' 之类的东西(我忘记了postgres 语法,可能不完全一样)。然后你就可以运行你的迁移了。

【讨论】:

    【解决方案2】:

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

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

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

    为了确保确实如此,只需在schema_migrations 表中找到包含如下数字的行:20130908214222

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

    INSERT INTO schema_migrations(
        version
    ) VALUES (
        20130908214222
    );
    

    下次您运行rake db:migrate时,ActiveRecord 将省略这一步,并继续迁移到结束而不会出现并发症。

    【讨论】:

      猜你喜欢
      • 2013-02-04
      • 2015-07-12
      • 1970-01-01
      • 2023-03-08
      • 2014-07-10
      • 2015-04-28
      • 2012-06-19
      • 2018-07-31
      • 1970-01-01
      相关资源
      最近更新 更多