无法在Heroku上创建表 - 迁移在本地工作但在Heroku上失败

时间:2014-05-11 16:42:12

标签: ruby-on-rails ruby ruby-on-rails-3 postgresql heroku

我正在使用Rails 3应用程序并尝试运行迁移。我正在尝试创建一个名为Songs的表,我能够成功创建表并在本地迁移。但是,当我将代码推送到Heroku并在那里迁移时,我遇到的错误是:

** Execute db:migrate
==  CreateSongs: migrating ====================================================
-- create_table(:songs)
NOTICE:  CREATE TABLE will create implicit sequence "songs_id_seq1" for serial column "songs.id"
rake aborted!
An error has occurred, this and all later migrations canceled:

PG::DuplicateTable: ERROR:  relation "songs" already exists
: CREATE TABLE "songs" ("id" serial primary key, "solo_cello" character varying(255), "created_at" timestamp, "updated_at" timestamp) /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.1.12/lib/active_record/connection_adapters/postgresql_adapter.rb:605:in `async_exec'

我意识到这个错误源于数据库中已经存在的表,但是当我运行

 heroku run "bundle exec rake db:schema:dump && cat db/schema.rb" 

我看到架构版本位于ActiveRecord :: Schema.define(:version => 20130915155113),并且在此迁移之后发生了创建歌曲模型的迁移(它是2014050604381​​7)。

这里是我本地架构的截断版本:

 ActiveRecord::Schema.define(:version => 20140511155456) do
 [other tables...] 
create_table "songs", :force => true do |t|
  t.string   "solo_cello"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "solo_violin"
  t.string   "duo_one"
  t.string   "duo_two"
  t.string   "trio_a_one"
  t.string   "trio_a_two"
  t.string   "trio_a_three"
  t.string   "trio_b_one"
  t.string   "trio_b_two"
  t.string   "trio_b_three"
  t.string   "quartet_one"
  t.string   "quartet_two"
  t.string   "quartet_three"
  t.string   "quartet_four"
end

以下是我的问题:

  1. 如果创建Song表的迁移(2014050604381​​7)稍后出现,如果数据库上的架构版本为20130915155113,那么该表是如何存在的?

  2. 要成功迁移,我需要做什么?我意识到我可以删除数据库(这是暂存环境)但是非常希望不在生产中执行此操作。

  3. 为什么迁移在我的本地计算机上运行正常但在Heroku上运行不正常?

1 个答案:

答案 0 :(得分:2)

听起来您的歌曲表可能会因为恢复数据库备份而遗留下来。在Heroku上恢复数据库备份只会重写备份中存在的表,但它不会丢弃在创建备份时尚未存在的表。

要解决此问题,需要遵循以下几个步骤:

  1. 放下桌子。您可以通过在终端中运行heroku pg:psql,然后执行查询DROP TABLE songs;来手动删除表。如果这是唯一有问题的表,您现在可以运行迁移。

  2. 删除数据库。如果您有数据库备份并且可以承受一些停机时间,您也可以通过从终端运行heroku pg:reset,然后restoring your database backup并运行迁移来删除数据库。