在新数据库上运行迁移会导致以下错误。
>> rake db:drop; rake db:create:all; rake db:migrate
1 activity-image-additions-!?
== CreateSomething: migrating ================================================
-- create_table(:somethings)
-> 0.0042s
== CreateSomething: migrated (0.0043s) =======================================
rake aborted!
An error has occurred, this and all later migrations canceled:
PG::UndefinedColumn: ERROR: column "id" does not exist
LINE 1: ...O "schema_migrations" ("version") VALUES ($1) RETURNING "id"
^
: INSERT INTO "schema_migrations" ("version") VALUES ($1) RETURNING "id
生成的SQL查询不应包含RETURNING "id"
,因为schema_migrations表没有id。
如果我在失败后尝试迁移数据库,则会成功:
>> rake db:migrate
== CreateSomething: migrating ================================================
-- create_table(:somethings)
-> 0.0041s
== CreateSomething: migrated (0.0042s) =======================================
我目前在OS X 10.8上运行PostgreSQL 9.2.4,Rails 4.0.0,pg gem 0.16.0。
唯一的迁移:
class CreateSomething < ActiveRecord::Migration
def change
create_table :somethings do |t|
t.integer :x
t.integer :y
end
end
end
注意:我在其他Rails项目中尝试过这种迁移,但它确实有效。还有其他不妥之处,但我不知道从哪里开始。
堆栈跟踪可用on pastebin。
答案 0 :(得分:5)
在我的情况下,此问题是由 attribute_normalizer gem引起的。 (见issue 42) 它只发生在第一次迁移后的一个完全空的数据库中。
使用1.2预发布版修复了问题。
答案 1 :(得分:0)
设置新数据库时,不应运行rake db:migrate
。相反,您应该使用rake db:schema:load
。
迁移系统旨在更新架构。在全新安装上,可以更快,更方便地立即加载最新的架构。