迁移重复错误

时间:2015-07-27 20:10:08

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

我的错误

== 20150727183532 ActsAsTaggableOnMigration:migrating ======================== - create_table(:tags) 耙子流产了! StandardError:发生错误,此以及所有后续迁移都已取消:

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

数据库中的第二次迁移:

    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:标签   端

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

3 个答案:

答案 0 :(得分:1)

这不是故意的,因为它无法奏效。正如您所见,您无法创建两次表格。您应该删除其中一个迁移,可能会从您删除的迁移中删除另一个迁移。

唯一的区别是taggings_count字段和索引。这里还没有足够的内容来说明你是否需要taggings_count或哪个是更好的索引。如果我不得不猜测,我会说第一个指数正试图创建一个覆盖指数,这是值得的。

答案 1 :(得分:0)

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

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

我个人更喜欢#2。

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

答案 2 :(得分:0)

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