Миграция Rails не меняет schema.rb
У меня есть миграция рельсов, которая не применяется к моему schema.rb. Миграция должна создать таблицу:
class CreateUserGraphs < ActiveRecord::Migration
def change
create_table :user_graphs do |t|
t.string :name
t.string :content
t.integer :user_id
t.string :type_id
t.integer :upload_id
t.timestamps
end
add_index :user_graphs, [:user_id, :created_at]
end
end
Я сделал db: сброс. Затем я попробовал rake db:migrate:up VERSION=123123123(это миграция #). Я нахожусь в моем "dev" окружении.
Почему миграция не влияет на schema.rb?
8 ответов
Из документации:
rake db:reset
Задача удалит базу данных, создаст ее заново и загрузит в нее текущую схему.
Это не то же самое, что запускать все миграции. Он будет использовать только содержимое текущего файла schema.rb. Если миграция не может быть отменена, "rake db:reset" может вам не помочь. Чтобы узнать больше о дампе схемы, смотрите раздел "Дампинг схемы и вы".
Так rake db:reset
=> db:drop db:create db:schema:load db:seed
Чтобы запустить все миграции, используйте:rake db:drop db:create db:migrate
Или жеdb:migrate:reset
=> rake db:drop db:create db:migrate
Я была такая же проблема. Я работаю в среде разработки (с Passenger и Apache). Среды производства и разработки используют одну и ту же базу данных.
Когда я бегу rake db:migrate
, БД была изменена, но схема не была обновлена. Тогда я бегу rake db:migrate RAILS_ENV=development
и теперь схема была обновлена.
Кажется, что рельсы / грабли запутались в моем окружении. Пассажир устанавливает среду разработки для этого сайта, но rake about
говорит "Окружающая среда производства".
Сначала вы пытаетесь остановить миграцию
rake db:migrate:down VERSION=20180605141404 # "VERSION=20180605141404 вашей версии миграции"
И снова ваша миграция
rake db:migrate:up VERSION=20180605141404 #"VERSION=20180605141404 вашей версии миграции"
У меня была та же проблема... оказывается, потому что я отредактировал имя моего файла миграции, чтобы он выглядел аккуратнее. Убедитесь, что вы не удалили отметку времени в заголовке файла миграции, как я.
Я удалил файл миграции, модель, контроллер и связанные тесты и заново сгенерировал контроллер и модель, которые устранили проблему.
"Версии" миграций выполняются с помощью временных меток. Rails проверяет, какие миграции ему нужно выполнить, сравнивая временную метку последнего запуска миграции и выясняя, есть ли новые.
Если версия вашей новой миграции 123123123
, он не будет запущен, так как это число не больше текущей отметки времени (например, 20131209170300
).
Нашел способ получить описание ошибки. побежал грабли дб: мигрировать: сбросить и получить
`SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "rooms" ADD "priority" integer NOT NULL/usr/local/rvm/gems/ruby-2.2.1/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `initialize`'
В моем случае это был параметр конфигурации в config/application.rb :
config.active_record.dump_schema_after_migration = false
Изменение его наtrue
решил проблему.
Попробуйте остановить Spring перед запуском миграции. Меня устраивает
bin/spring stop