我的错误
== 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:标签 端
我试图了解进行此迁移的人打算做什么。
答案 0 :(得分:1)
这不是故意的,因为它无法奏效。正如您所见,您无法创建两次表格。您应该删除其中一个迁移,可能会从您删除的迁移中删除另一个迁移。
唯一的区别是taggings_count字段和索引。这里还没有足够的内容来说明你是否需要taggings_count或哪个是更好的索引。如果我不得不猜测,我会说第一个指数正试图创建一个覆盖指数,这是值得的。
答案 1 :(得分:0)
习惯它。此错误将在以后经常发生。通常,当您的迁移在中间失败时会发生这种情况,例如您的表已创建,但稍后创建索引失败。然后,当您尝试重新运行迁移时,表已存在,迁移失败。
有几种方法可以解决这种情况: 1)您可以删除表或部分创建的任何其他内容,然后重新运行。 2)您可以编辑该特定迁移并在重新运行时注释掉表创建部分(然后您可以取消注释)。
我个人更喜欢#2。
我不得不说这种情况只发生在某些数据库中。您将在MySQL中看到它,但不会在PostreSQL中看到它。这是因为PostreSQL完全回滚了失败迁移的变化(包括成功创建的表等);和MySQL决定不应该回滚部分成功迁移的变化。
答案 2 :(得分:0)
ActsAsTaggable *有时会在升级gem时安装重复迁移(或接近重复)。 db / schema.rb是否已签入repo?如果是这样,未更改的版本(一旦开始迁移,它会被更改)将具有" right"设置并帮助您找出要删除的内容。