【问题标题】:Rails looking for Nonexistent ID column in schema_migrations table during initial migrartionRails 在初始迁移期间在 schema_migrations 表中寻找不存在的 ID 列
【发布时间】:2013-08-06 01:27:46
【问题描述】:

在新数据库上运行迁移会导致以下错误。

>> 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

【问题讨论】:

  • 我刚刚使用 SQLite 和 Postgres 在本地进行了完全相同的迁移,没有任何问题。
  • 没错。我在另一个 Rails 项目中做了同样的事情,没有任何问题。还有其他问题……但我不确定是什么。
  • 迁移系统使用schema_migrations 表来跟踪已运行的迁移,它应该有一个version varchar(255) not null 列。是否有机会从该异常中看到堆栈跟踪?
  • 这是stack trace
  • 我不确定为什么要附加 RETURNING "id" 位...

标签: ruby-on-rails ruby rake rails-postgresql


【解决方案1】:

在我的例子中,这个问题是由 attribute_normalizer gem 引起的。 (见issue 42) 只有在第一次迁移后数据库完全为空时才会发生这种情况。

使用 1.2 预发行版解决了这个问题。

【讨论】:

  • 感谢分享。让我很困惑。
【解决方案2】:

当你设置一个新的数据库时,你不应该运行rake db:migrate。相反,您应该使用rake db:schema:load

迁移系统旨在更新架构。全新安装可以更快、更方便地立即加载最新架构。

【讨论】:

  • 看来我把createsetup 搞混了。另外,这是数据库特定的问题吗?我在使用 sqlite 时没有看到这个错误。
猜你喜欢
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2014-11-02
  • 2012-04-10
  • 1970-01-01
相关资源
最近更新 更多