【问题标题】:Migration Duplication Error迁移重复错误
【发布时间】:2015-10-18 04:24:36
【问题描述】:

我的错误

== 20150727183532 ActsAsTaggableOnMigration:迁移 ======================== -- create_table(:tags) 耙中止! StandardError:发生错误,此迁移和所有后续迁移已取消:

PG::DuplicateTable: 错误: 关系“标签”已经存在 : CREATE TABLE "tags" ("id" 序列主键,"name" 字符变化)

数据库中的第二次迁移:

    create_table :tags do |t|
        t.string            :name
        t.integer           :taggings_count, default: 0
    end
    add_index :tags, :name, unique: true


    create_table :taggings do |t|
        t.references        :tag
        t.references        :taggable,      polymorphic: true
        t.references        :tagger,        polymorphic: true
        t.string                :context,       limit: 128
        t.datetime          :created_at
    end
    add_index :taggings, [ :tag_id, :taggable_id, :taggable_type, :context, :tagger_id, :tagger_type ],
        unique: true, name: 'taggings_idx'

end

这是后来的迁移,问题似乎来自哪里?

def self.up

create_table :tags do |t|
  t.string :name
end

create_table :taggings do |t|
  t.references :tag

  # You should make sure that the column created is
  # long enough to store the required class names.
  t.references :taggable, polymorphic: true
  t.references :tagger, polymorphic: true

  Limit is created to prevent MySQL error on index
  # length for MyISAM table type: http://bit.ly/vgW2Ql
  t.string :context, limit: 128

  t.datetime :created_at
end

add_index :taggings, :tag_id
add_index :taggings, [:taggable_id, :taggable_type, :context]

结束

def self.down drop_table :标记 drop_table :标签 结束

我试图了解进行此迁移的人打算做什么。

【问题讨论】:

    标签: ruby-on-rails migration database-migration rails-migrations


    【解决方案1】:

    ActsAsTaggable* 在升级 gem 时有时会安装重复迁移(或接近重复)。 db/schema.rb 是否签入到 repo 中?如果是这样,未更改的版本(一旦您开始迁移,它就会被更改)将具有“正确”的设置,并帮助您确定要删除的设置。

    【讨论】:

      【解决方案2】:

      习惯它。这个错误以后会经常发生。通常,它发生在您的迁移在中间失败时,例如您的表已创建,但后来创建索引失败。然后,当您尝试重新运行迁移时,表已经存在,迁移失败。

      有几种方法可以处理这种情况: 1)您可以删除表或部分创建的其他任何内容,然后重新运行。 2)您可以编辑该特定迁移并在重新运行时注释掉表创建部分(然后您可以取消注释它)。

      我个人更喜欢#2。

      我不得不说这种情况只发生在某些数据库中。您将在 MySQL 中看到它,但在 PostreSQL 中看不到它。发生这种情况是因为 PostreSQL 完全回滚失败迁移的更改(包括成功创建的表等);并且 MySQL 决定不应回滚部分成功迁移中的更改。

      【讨论】:

      • 感谢您的回答!我最终删除了后一个迁移,它工作正常。我只是不确定这样做的人是否试图在我丢失的表中添加一些东西。现在一切都很好。
      【解决方案3】:

      这不可能是故意的,因为它行不通。如您所见,您不能创建一个表两次。您应该删除其中一个迁移,可能会从您删除的迁移合并到另一个迁移。

      唯一的区别是 taggings_count 字段和索引。这里不足以说明您是否需要 taggings_count 或者哪个是更好的索引。如果我不得不猜测,我会说第一个索引试图创建一个覆盖索引,这是值得的。

      【讨论】:

        猜你喜欢
        • 2016-04-18
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        • 2017-01-03
        • 1970-01-01
        • 2015-10-02
        相关资源
        最近更新 更多