PG::DuplicateTable: 错误:关系“posts”已经存在。

26

当我运行rake db:migrate时,我会得到以下输出:

== 20141219011612 CreatePost: 迁移中 ======================================= -- create_table("posts") rake中止! StandardError:发生错误,取消此次迁移和后续所有迁移: == 20141219011612 Postposts: 迁移中 ======================================= -- create_table("posts") rake中止! StandardError:发生错误,取消此次迁移和后续所有迁移:

PG::DuplicateTable:ERROR:关系“posts”已经存在:CREATE TABLE "posts" ("id" serial primary key, "post" text, "release_date" timestamp, "created_at" timestamp, "updated_at" timestamp) /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in async_exec' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in execute' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_adapters/abstract_adapter.rb:373:in log' /home/admin/.rvm/gems/ruby-2.1.5/gems/activesupport-4.1.8/lib/active_support/notifications/instrumenter.rb:20:in instrument' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_adapters/abstract_adapter.rb:367:in log' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_adapters/postgresql/database_statements.rb:127:in execute'

/home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_adapters/abstract/schema_statements.rb:205:in `create_table' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/migration.rb:649:in `block in method_missing' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/migration.rb:621:in `block in say_with_time' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/migration.rb:621:in `say_with_time' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/migration.rb:641:in `method_missing' ... migrate' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/railties/databases.rake:34:in `block (2 levels) in ' Tasks: TOP => db:migrate (See full trace by running task with --trace)
我不明白为什么会出现这种情况,因为在我的架构文件中没有post表。

1
在Rails控制台中删除重复的表。这个链接有帮助:https://dev59.com/AG865IYBdhLWcg3wCqBA#13299109 - prograils
请先检查您的数据库是否存在相同的表名,如果没有,请告诉我。我会给您解决方案。 - Foram
8个回答

87

你的数据库中出现了名为“posts”的数据表,可能是由于之前进行的某次迁移操作被删除但未回滚导致的。如果你不关心数据库中的任何数据,你可以运行:

rake db:drop db:create db:migrate

使您的开发数据库与当前的迁移保持一致。

如果您有其他表中不想丢失的数据,请打开数据库控制台并手动删除帖子表:

$ rails db

# drop table posts;

接着再次运行db:migrate命令。


1
但是方案文件中怎么可能没有帖子表呢? - Leag Er
1
不了解你所采取的所有步骤的完整历史,我无法确定。可能是你用 Git 或其他源代码控制工具覆盖了 schema.rb 的旧版本。无论如何,如果你运行 rake db:schema:dumpposts 一定会出现在你的 schema.rb 中。 - Bill Doughty
1
感谢提供第二部分内容,因为移除和重置一切并不总是好事。 - Abhinay
@LeagEr,如果我的答案对您有用,请接受它。谢谢。 - Bill Doughty
输入\q并按下ENTER键退出控制台。 - Fellow Stranger
显示剩余3条评论

3

对于那些没有得到你的答案的人


在我的情况下,一个月前我一直在开发一个功能,当时刚好创建了该字段。现在当我尝试运行迁移rake db:migrate时,我看到了这个错误。我知道并确信这不是由于任何错误导致的。

我还尝试回滚该特定的迁移。

rake db:migrate:down VERSION=20200526083835

但由于某些原因,它没有起到作用,在继续之前,我不得不在该迁移文件中注释掉up方法。

# frozen_string_literal: true

class AddColToAccounts < ActiveRecord::Migration
  def up
    # execute 'commit;'
    #
    # add_column :accounts, :col, :boolean,
    #            null: false,
    #            default: false
    

  end

  def down
    execute 'commit;'

    remove_column :accounts, :col
    
  end
end


现在,我可以运行迁移了。

最后,我撤销了注释并完成了操作。

谢谢。


1

请检查您的db/schema.rb文件

很可能在其中创建了与db/migrate/[timestamp]your_migration中迁移相同的表格

如果db/migrate/[timestamp]your_migration与schema中的重复,则可以删除它,并且应该可以正常工作。


0

这将删除您的数据,请勿在生产环境中执行。 首先,通过执行此数据库命令删除任何孤立的迁移********** NO FILE **********(如果有的话):

delete from schema_migrations where version='<MIGRATION_ID>';

那么

rails db:schema:load

那么

rails db:migrate

这对我有用。


0
我发现的一个技巧是在迁移文件中创建表之前加入 pry。
require 'pry'
binding.pry

create_table :your_table_name

并删除那个表:

drop_table :your_table_name

然后您可以删除drop_table语句,它将正常工作!


0

如果有其他人需要帮助,我想提醒一下自己:我之前使用的是在使用MySQL时生成的schema.rb文件。在转换到Postgres后,我简单地忘记了需要运行rake db:migrate才能使用rake db:schema:load


0

终止当前的Postgres进程:

sudo kill -9 `ps -u postgres -o pid` 

重新启动Postgres:

brew services start postgres

删除、创建和迁移表:

rails db:drop db:create db:migrate

0

我曾经遇到过同样的问题,唯一有效的方法是在Rails控制台中删除表格,就像这样

ActiveRecord::Migration.drop_table(:products)

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