【问题标题】:PG::DuplicateTable: ERROR: relation "posts" already existsPG::DuplicateTable: 错误: 关系“帖子”已经存在
【发布时间】:2015-02-17 22:42:42
【问题描述】:

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

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

PG::DuplicateTable: 错误: 关系 "posts" 已经存在: CREATE TABLE "posts" ("id" 序列主键、"post" 文本、"release_date" 时间戳,“created_at”时间戳,“updated_at”时间戳) /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 block 正在执行' /home/admin/.rvm/gems/ruby-2.1.5/gems/activerecord-4.1.8/lib/active_record/connection_adapter/abstract_adapter.rb:373:in block 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_adapter/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 个级别) in ' 任务:TOP => db:migrate (参见 通过使用 --trace 运行任务来完整跟踪)

我不明白这怎么可能,因为在方案文件中我没有发布表。

【问题讨论】:

  • 删除 Rails 控制台中的重复表。这对我有帮助:stackoverflow.com/a/13299109/6594668
  • 请先检查您的数据库是否存在相同的表名,如果没有,请告诉我。会给你解决方案

标签: ruby-on-rails postgresql


【解决方案1】:

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


就我而言,一个月前我一直在开发一个功能,该字段恰好是在那个时候创建​​的。现在,当我尝试运行迁移 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


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

最后,我撤消了评论的事情,我就完成了。

谢谢

【讨论】:

    【解决方案2】:

    杀死当前的postgres进程:

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

    再次启动 postgres:

    brew services start postgres
    

    删除、创建和迁移表:

    rails db:drop db:create db:migrate
    

    【讨论】:

      【解决方案3】:

      我发现的其中一个技巧是在迁移文件上创建表之前先进行 pry。

      require 'pry'
      binding.pry
      
      create_table :your_table_name
      

      并删除该表:

      drop_table :your_table_name
      

      之后,您可以删除 drop_table 行,它会正常工作!

      【讨论】:

        【解决方案4】:

        如果这对其他人有帮助,我意识到我一直在使用在使用 MySQL 时生成的 schema.rb 文件。转换到 Postgres 后,我忘记了在使用 rake db:schema:load 之前需要运行 rake db:migrate

        【讨论】:

          【解决方案5】:

          检查你的 db/schema.rb

          除了 db/migrate/[timestamp]your_migration 中的迁移之外,您很可能在那里创建了同一个表

          如果 db/migrate/[timestamp]your_migration 与架构中找到的副本重复并且应该可以工作,则可以删除它。

          【讨论】:

            【解决方案6】:

            不知何故,您最终在数据库中得到了一个名为“posts”的表。也许来自您删除而不回滚的先前迁移?如果您不关心数据库中的任何数据,则可以运行

            rake db:drop db:create db:migrate
            

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

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

            $ rails db
            
            # drop table posts;
            

            然后再次运行db:migrate

            【讨论】:

            • 但是scheme文件中怎么可能没有post表呢?
            • 我不能说不知道您已采取的所有步骤的完整历史记录。可能是您已经用 git 或您使用的任何源代码控制覆盖了 schema.rb 到旧版本。无论如何,如果你运行rake db:schema:dump,那么posts 肯定会在你的schema.rb 中。
            • 另外,要明确的是 posts(复数)导致错误。你一直提到post 表(单数)。我假设这只是您的一个错字,并且您实际上是在架构文件中寻找 posts
            • 感谢第二部分,因为删除和重置所有内容总是不是一件好事。
            • @LeagEr,如果它对你有用,请接受我的回答。谢谢。
            猜你喜欢
            • 1970-01-01
            • 2022-11-10
            • 1970-01-01
            • 2018-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-12
            • 1970-01-01
            相关资源
            最近更新 更多