Rails ищет столбец несуществующего идентификатора в таблице schema_migrations во время начальной миграции

Выполнение миграции на новой базе данных приводит к следующей ошибке.

>> 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 не имеет идентификаторов.

Если я попытаюсь перенести базу данных после сбоя, это будет успешным:

>> rake db:migrate

==  CreateSomething: migrating ================================================
-- create_table(:somethings)
   -> 0.0041s
==  CreateSomething: migrated (0.0042s) =======================================

В настоящее время я использую PostgreSQL 9.2.4, Rails 4.0.0, pg gem 0.16.0 на OS X 10.8.

Единственная миграция:

class CreateSomething < ActiveRecord::Migration
  def change
    create_table :somethings do |t|
      t.integer :x
      t.integer :y
    end
  end
end

Примечание: я пробовал эту миграцию в других проектах Rails, и она работает. Что-то еще не так, но я не уверен, с чего начать.

Трассировка стека доступна на pastebin.


person fny    schedule 06.08.2013    source источник
comment
Я просто выполнил такую ​​же точную миграцию локально с SQLite и Postgres, и у меня не было проблем.   -  person Powers    schedule 06.08.2013
comment
Точно. Я сделал то же самое в другом проекте Rails без проблем. Что-то еще не так ... но я не уверен, что именно.   -  person fny    schedule 06.08.2013
comment
Таблица schema_migrations используется системой миграций для отслеживания того, какие миграции были запущены, в ней должен быть один столбец version varchar(255) not null. Есть ли шанс увидеть трассировку стека от этого исключения?   -  person mu is too short    schedule 06.08.2013
comment
Вот трассировка стека.   -  person fny    schedule 06.08.2013
comment
Я не уверен, почему добавляется этот бит RETURNING "id" ...   -  person fny    schedule 06.08.2013


Ответы (2)


При установке новой базы данных не следует запускать rake db:migrate. Вместо этого вы должны использовать rake db:schema:load.

Система миграции предназначена для обновления схемы. При новой установке быстрее и удобнее загружать последнюю схему сразу.

person Simone Carletti    schedule 13.12.2013
comment
Похоже, я перепутал create с setup. Кроме того, это проблема, связанная с БД? Я не вижу этой ошибки при использовании sqlite. - person fny; 14.12.2013

В моем случае эта проблема была вызвана гемом attribute_normalizer. (См. проблему 42) Это произошло только с полностью пустой базой данных после самой первой миграции.

Использование предварительной версии 1.2 устранило проблему.

person Daniel Rikowski    schedule 13.12.2013
comment
Спасибо, что поделились этим. Это озадачило меня. - person jrhorn424; 09.02.2014