我尝试迁移数据库时出错。我不完全记得我是怎么来到这里的,但我相信我:
从heroku postgres数据库中提取,这样我就可以测试一下事情是否适用于实际数据。然后尝试了db迁移,但给了我这个错误:
rake db:migrate
== CreateRequests: migrating =================================================
-- create_table(:requests)
NOTICE: CREATE TABLE will create implicit sequence "requests_id_seq1" for serial column "requests.id"
rake aborted!
An error has occurred, this and all later migrations canceled:
PG::Error: ERROR: relation "requests" already exists
: CREATE TABLE "requests" ("id" serial primary key, "title" character varying(255), "content" text, "category" character varying(255), "status" character varying(255), "requested_track_id" integer, "created_at" timestamp, "updated_at" timestamp)
有什么想法吗?
答案 0 :(得分:4)
我不确定你使用什么拉动策略,但是如果我们对你的拉动策略做出两个合理的假设:
--delete
才能获得该实用程序的预期行为。如果你的步骤是正确的,那么你发生了什么是覆盖了schema_migrations
表,所以Rails认为你还没有添加表,但是由于上面的#2,你的heroku也没有删除表。
不要创建另一个迁移!!! 除了你的计算机之外,这将在所有人的计算机上失败,但只会在你的计算机上运行一次。
相反,运行rails dbconsole
并执行类似DROP TABLE 'requests'
的内容(我忘记了postgres语法,可能不是那样)。然后,您可以运行迁移。
答案 1 :(得分:3)
还有另一种方法可以避免丢弃包含数据的表。
在这些情况下,我要做的是检查哪个迁移失败。
假设您有一个文件db/migrate/20130908214222_create_requests.rb
,由于某种原因,ActiveRecord过去在将此迁移存储在其跟踪系统中时失败了。
为了确保这种情况,只需在schema_migrations
表中找到一个包含如下例子的数字的行:20130908214222
如果该行不存在,则只需插入一行:
INSERT INTO schema_migrations(
version
) VALUES (
20130908214222
);
下次运行rake db:migrate
时,ActiveRecord将省略此步骤,并将继续迁移到最终而不会出现问题。