2010-03-22 34 views
1

我在我的开发数据库(sqlite3)中填充了少量测试数据的表'invoices'。无法扭转貌似简单的rails迁移 - 获取“altered_table.column可能不是NULL”错误

我想一列“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 

我找不到此错误的任何文档。有人能够解释我做错了什么,更重要的是我该如何解决这个问题?

回答

0

好的,我终于解决了这个星期下来的轨道。

我多次遇到这个问题,并在情况下,我想撤消他们做任何迁移之前备份我的数据库的习惯了,因为这错误不断弹出。

问题是我安装了sqlite3 gem,而不是sqlite3-ruby gem。我没有看到为什么会发生这种情况,但这样做后问题就消失了;回滚STEP = N回去ñ迁移:

sudo gem uninstall sqlite3 
sudo gem install sqlite3-ruby 

仅供参考我关于Ruby 1.9.1

+0

唉,我有同样的问题,将这样移除目前的所有数据库中的记录? – 2013-01-02 18:30:09

+0

它不应该这样做。 SQLite数据库存储在不应受修改gem或sqlite本身影响的单独文件中。 – brad 2013-01-03 01:39:30

4

您正在运行不按顺序的迁移。试试这个系列:

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

您还可以使用耙分贝的运转轨道2.3.5。 rake db:reset将删除数据库,创建数据库,并从头开始运行所有迁移。 – Fred 2010-03-23 03:11:06

+0

谢谢,这并没有解决我的问题(即使耙分贝:重置没有)。我最终删除了整个数据库文件并重新开始。这一切都有效。我一定在某个地方犯了一个错误,但我从来没有拿过它。谢谢你的帮助。 – brad 2010-03-29 03:15:05