我正在使用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),并且在此迁移之后发生了创建歌曲模型的迁移(它是20140506043817)。
这里是我本地架构的截断版本:
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
如果创建Song表的迁移(20140506043817)稍后出现,如果数据库上的架构版本为20130915155113,那么该表是如何存在的?
要成功迁移,我需要做什么?我意识到我可以删除数据库(这是暂存环境)但是非常希望不在生产中执行此操作。
为什么迁移在我的本地计算机上运行正常但在Heroku上运行不正常?
答案 0 :(得分:2)
听起来您的歌曲表可能会因为恢复数据库备份而遗留下来。在Heroku上恢复数据库备份只会重写备份中存在的表,但它不会丢弃在创建备份时尚未存在的表。
要解决此问题,需要遵循以下几个步骤:
放下桌子。您可以通过在终端中运行heroku pg:psql
,然后执行查询DROP TABLE songs;
来手动删除表。如果这是唯一有问题的表,您现在可以运行迁移。
删除数据库。如果您有数据库备份并且可以承受一些停机时间,您也可以通过从终端运行heroku pg:reset
,然后restoring your database backup并运行迁移来删除数据库。