7

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

  1. 创建新分支,搭建“请求”,db:migrated,切换回主分支,合并分支
  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) 
    

有任何想法吗?

4

2 回答 2

5

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

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

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

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

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

于 2013-07-25T19:41:19.930 回答
3

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

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

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

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

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

INSERT INTO schema_migrations(
    version
) VALUES (
    20130908214222
);

下次你运行时rake db:migrate,ActiveRecord 会省略这一步,并且会继续迁移到结束而不会出现复杂情况。

于 2015-08-05T00:26:21.680 回答