Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Can';不要再次重命名ActiveRecord表&引用;[表]";不存在_Ruby On Rails_Postgresql_Activerecord - Fatal编程技术网

Ruby on rails Can';不要再次重命名ActiveRecord表&引用;[表]";不存在

Ruby on rails Can';不要再次重命名ActiveRecord表&引用;[表]";不存在,ruby-on-rails,postgresql,activerecord,Ruby On Rails,Postgresql,Activerecord,不久前,我运行了以下rails迁移来更改表的名称: class RenameMaterialDonationsToMaterialDonationRequests < ActiveRecord::Migration def change rename_table :material_donations, :material_donation_requests end end 我正在使用Postgresql。在pgAdmin3中,我可以看到pkey仍然保留第一次迁移之前的表

不久前,我运行了以下rails迁移来更改表的名称:

class RenameMaterialDonationsToMaterialDonationRequests < ActiveRecord::Migration
  def change
    rename_table :material_donations, :material_donation_requests
  end
end
我正在使用Postgresql。在pgAdmin3中,我可以看到pkey仍然保留第一次迁移之前的表名:

class RenameMaterialDonationRequestsToHelpRequests < ActiveRecord::Migration
  def change
    rename_table :material_donation_requests, :help_requests
  end
end
CONSTRAINT material_donations_pkey PRIMARY KEY (id)

如何修复此问题以重命名该表?

这是一个黑客解决方案,添加另一个迁移文件并在第二次更改表名之前执行此操作:

execute "ALTER TABLE material_donation_requests DROP CONSTRAINT material_donations_pkey;"
execute "ALTER TABLE material_donation_requests ADD PRIMARY KEY (id);"

在你下一次改名后,你可能需要做一些类似的事情

下面的答案可能有用,但我决定这样做:

execute "ALTER INDEX material_donations_pkey RENAME TO material_donation_requests_pkey;"

我之所以选择这个命令,是因为它是迁移试图作为原始迁移的一部分自动运行的命令。当我第一次重命名此表时,该命令并没有自动成为4.0之前rails的一部分,所以我现在运行它。我觉得做rails目前正在做的事情更舒服。

添加了针对类似问题的解决方案。 下面是运行迁移时的错误

01 PG::UndefinedTable: ERROR:  relation "fundraise_stories_pkey" does not exist
01 : ALTER INDEX "fundraise_stories_pkey" RENAME TO "fundraisers_pkey"
通过pgadmin和表fundraise_故事的选定约束连接到数据库。它的名字是“fundrise_stories_pkey”。 所以这是一个老错误,因为约束名与表名不匹配

解决方案:

  • 在表的约束部分下查找现有索引名。就我而言,这是“筹款故事”
  • 在重命名表之前重命名索引
  • 最后,重命名该表 下面是重命名表之前重命名索引的修改迁移

    def self.up
        execute "ALTER INDEX fundrise_stories_pkey RENAME TO fundraise_stories_pkey;"
        rename_table :fundraise_stories, :fundraisers
    end
    
    日志


    你说得对,这确实有点骇人。看起来rails现在正试图修改pkey,但找不到正确的名称。它不应该在第一次迁移时更改pkey吗?此外,DROP和ADD命令是否会改变任何数据?迁移中似乎失败的语句是ALTER INDEX。。。改名。这是我在迁移中可以做到的吗?这会影响我的数据吗?实际上,一旦更改了表名,就应该立即更改主键。在进行任何迁移之前,请先进行备份。明白。我认为发生这种情况的原因是我在进行迁移时使用的是rails 4.0.x,有一个bug文件指出重命名表并没有更新pkey名称。但是我相信它已经被“修复”,因此现在它正在尝试更新它,但是不能,因为它正在寻找错误的名称(上次没有更新的名称)。有什么理由我不应该只使用迁移尝试使用但无法使用的命令吗?也就是说:
    ALTER INDEX“material\u invitation\u requests\u pkey”重命名为“help\u requests\u pkey”
    很有魅力!今天在投入生产时遇到了这个问题(尽管dev、test和stage都工作正常)-从控制台运行此命令重命名索引,然后迁移运行正常。我欠你一杯冰镇啤酒。
    def self.up
        execute "ALTER INDEX fundrise_stories_pkey RENAME TO fundraise_stories_pkey;"
        rename_table :fundraise_stories, :fundraisers
    end
    
    D, [2020-02-02T17:16:27.428294 #7363] DEBUG -- :    (0.2ms)  BEGIN
    == 20200127102616 RenameFundraiseStoryTableToFundraisers: migrating ===========
    -- execute("ALTER INDEX fundrise_stories_pkey RENAME TO fundraise_stories_pkey;")
    D, [2020-02-02T17:16:27.434366 #7363] DEBUG -- :    (5.5ms)  ALTER INDEX fundrise_stories_pkey RENAME TO fundraise_stories_pkey;
       -> 0.0061s
    -- rename_table(:fundraise_stories, :fundraisers)
    D, [2020-02-02T17:16:27.435722 #7363] DEBUG -- :    (0.7ms)  ALTER TABLE "fundraise_stories" RENAME TO "fundraisers"
    D, [2020-02-02T17:16:27.438769 #7363] DEBUG -- :    (0.3ms)  ALTER TABLE "public"."fundraise_stories_id_seq" RENAME TO "fundraisers_id_seq"
    D, [2020-02-02T17:16:27.439334 #7363] DEBUG -- :    (0.2ms)  ALTER INDEX "fundraise_stories_pkey" RENAME TO "fundraisers_pkey"
    D, [2020-02-02T17:16:27.445452 #7363] DEBUG -- :    (0.8ms)  ALTER INDEX "index_fundraise_stories_on_bank_account_id" RENAME TO "index_fundraisers_on_bank_account_id"
    D, [2020-02-02T17:16:27.446153 #7363] DEBUG -- :    (0.3ms)  ALTER INDEX "index_fundraise_stories_on_creator_id_and_creator_type" RENAME TO "index_fundraisers_on_creator_id_and_creator_type" 
       -> 0.0131s
    == 20200127102616 RenameFundraiseStoryTableToFundraisers: migrated (0.0193s) ==