无法反转看似简单的rails迁移 – 获取“changed_table.column可能不是NULL”错误

我在我的开发数据库(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 

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

您正在运行无序迁移。 试试这个系列:

 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 

不确定为什么你无法访问你的专栏。 检查数据库,确保它已正确创建。

好的,我终于在赛道上解决了这个星期。

我反复遇到这个问题并养成了在进行任何迁移之前备份我的数据库的习惯,以防我想要撤消它们,因为这个错误不断弹出。

问题是我安装了sqlite3 gem而不是sqlite3-ruby gem。 我没有调查为什么会发生这种情况,但这样做后问题就消失了;

 sudo gem uninstall sqlite3 sudo gem install sqlite3-ruby 

仅供参考我在Ruby 1.9.1上运行Rails 2.3.5