【问题标题】:Duplicate Table Error on Heroku - Table already exists but migration says down - works locallyHeroku 上的重复表错误 - 表已经存在,但迁移失败 - 在本地工作
【发布时间】:2016-12-27 06:20:27
【问题描述】:

我创建了一个用户表并将其迁移到 Heroku,它运行良好。我试图添加一个管理表,但出了点问题,我不确定发生了什么。 users 和 admins 表在我的本地环境中都可以正常工作,但是当我将迁移推送到 Heroku 时,我收到一个错误,即 users 表已经创建:

迁移到 DeviseCreateUsers (20151119150443) == 20151119150443 DeviseCreateUsers:迁移 ================================ -- create_table(:users) PG::DuplicateTable: 错误: 关系 "users" 已经存在 : CREATE TABLE "users" ("id" 序列主键, “电子邮件”字符变化(255)默认''非空, “encrypted_pa​​ssword”字符变化(255)DEFAULT '' NOT NULL, “reset_password_token”字符变化(255), “reset_password_sent_at”时间戳,“remember_created_at”时间戳, "sign_in_count" 整数 DEFAULT 0 NOT NULL, "current_sign_in_at" 时间戳,“last_sign_in_at”时间戳,“current_sign_in_ip”字符 变化(255),“last_sign_in_ip”字符变化(255),“created_at” timestamp NOT NULL, "updated_at" timestamp NOT NULL) rake 中止! StandardError:发生错误,此迁移和所有后续迁移 取消:

PG::DuplicateTable: 错误: 关系“用户”已经存在 : CREATE 表“用户”(“id”序列主键,“电子邮件”字符变化(255) DEFAULT '' NOT NULL,“encrypted_pa​​ssword”字符变化(255) DEFAULT '' NOT NULL,“reset_password_token”字符变化(255), “reset_password_sent_at”时间戳,“remember_created_at”时间戳, "sign_in_count" 整数 DEFAULT 0 NOT NULL, "current_sign_in_at" 时间戳,“last_sign_in_at”时间戳,“current_sign_in_ip”字符 变化(255),“last_sign_in_ip”字符变化(255),“created_at” 时间戳非空,“updated_at”时间戳非空) /app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.1.8/lib/active_record/connection_adapters/postgresql/database_statements.rb:128:in `async_exec'

这是我在本地检查迁移状态时所说的:

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20151103020350  Create restaurants
   up     20151119150443  Devise create users
   up     20160809004949  Devise create admins

heroku 上的迁移状态:

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20151030033303  ********** NO FILE **********
   up     20151102165952  ********** NO FILE **********
   up     20151102170119  ********** NO FILE **********
   up     20151103020350  Create restaurants
   up     20151103160832  ********** NO FILE **********
   up     20151103170143  ********** NO FILE **********
   up     20151105172014  ********** NO FILE **********
   up     20151114043509  ********** NO FILE **********
  down    20151119150443  Devise create users
  down    20160809004949  Devise create admins

当我进入 Heroku 控制台时,它说我有 2 个用户,因此用户表已迁移,但迁移状态显示为关闭。

我不介意丢失用户表中的数据,但我真的不想丢失餐厅表中的数据。不知道如何解决这个问题。

【问题讨论】:

  • Devise 为您创建用户表。您只应该在 Devise 自己创建的内容之上添加您的应用程序需要的任何列。在这种情况下,您确实是在尝试创建 Devise 已经创建的表。
  • @MarsAtomic - 我使用设计创建用户表,它工作正常。我尝试添加一个管理表,但它不起作用,因为即使我运行了该迁移,它也出于某种原因显示用户迁移。我不知道为什么会发生这种情况,也不知道如何在不丢失所有数据的情况下修复它。
  • 重点是,除了rails g devise user 之外,您不应该为创建用户表其他 进行任何迁移。如果您有其他字段要添加到 users 表中,那么您将有 'rails g migration AddWhateverToUsers 后跟 rails g devise admin 来添加 Devise for admins。根据您发布的迁移,您似乎正在尝试创建用户表两次。请查看设计documentation

标签: ruby-on-rails heroku


【解决方案1】:

由于迁移或自定义操作不同,我认为您的数据库已经拥有该表。

通过命令行试试这个,它对我有用!

rake db:drop
rake db:create
rake db:migrate

【讨论】:

  • 如果这样做,我将丢失所有数据。
  • 哦,是的,这将恢复并再次创建您的数据库存储。请问,您能否添加涉及用户和管理员的每个迁移的初始行?或查看 db / schema 内部以查找表上的一些冲突。
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2019-01-30
  • 2019-05-12
  • 2020-03-03
  • 1970-01-01
相关资源
最近更新 更多