Невозможно отменить, казалось бы, простую миграцию рельсов - ошибка «altered_table.column не может быть NULL» - PullRequest
1 голос
/ 22 марта 2010

В моей базе данных разработки (sqlite3) есть таблица «накладные», заполненная небольшим количеством тестовых данных.

Я хотел добавить к нему столбец invoice_number и настроить миграцию следующим образом:

class AddInvoiceNumberColumnToInvoices < ActiveRecord::Migration
  def self.up
    add_column :invoices, :invoice_number, :integer
  end

  def self.down
    remove_column :invoices, :invoice_number
  end
end

Я пробежал rake db:migrate, и он, казалось, мигрировал очень хорошо. Однако, когда я попытался получить доступ к этому столбцу через ActiveRecord, его там не было. Я решил отменить эту миграцию и повторить попытку (не уверен, что собираюсь попробовать, но думал, что начну с ее отмены) с rake db:migrate VERSION='whatever_the_migration_before_this_one_was_called'. Это не удалось с сообщением об ошибке

==  AddInvoiceNumberColumnToInvoices: reverting ===============================
-- remove_column(:invoices, :invoice_number)
rake aborted!
An error has occurred, this and all later migrations canceled:

altered_invoices.invoice_number may not be NULL

Я не могу найти документацию по этой ошибке. Кто-нибудь может объяснить, что я сделал неправильно, и, что более важно, как я могу это исправить?

Ответы [ 2 ]

4 голосов
/ 23 марта 2010

Вы выполняете миграции не по порядку. Попробуйте эту серию:

rake db:migrate # now invoice_number is available
rake db:migrate:down VERSION=invoice_number_migration # invoice_number is NOT available
rake db:migrate:up VERSION=invoice_number_migration # invoice_number is now available again

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

0 голосов
/ 04 мая 2010

ОК, я наконец решил эту неделю.

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

Проблема заключалась в том, что у меня был установлен гем sqlite3 вместо гема sqlite3-ruby. Я не выяснил, почему это происходит, но проблема исчезла после этого;

sudo gem uninstall sqlite3
sudo gem install sqlite3-ruby

К вашему сведению, я запускаю Rails 2.3.5 на Ruby 1.9.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...