Ruby on Rails:向现有数据库添加列

20
我遇到了一个错误:
SQLite3::SQLException: no such column: ideas.list_id: 
SELECT "ideas".* FROM "ideas"  
WHERE "ideas"."list_id" = 2

但是我在数据库迁移文件中添加了 t.integer :list_id
class CreateIdeas < ActiveRecord::Migration
  def change
    create_table :ideas do |t|
      t.string :name
      t.text :description
      t.string :picture

      t.timestamps
    end
    add_foreign_key :ideas, :lists
  end
end

这给了我这个:
class CreateIdeas < ActiveRecord::Migration
  def change
    create_table :ideas do |t|
      t.string :name
      t.text :description
      t.string :picture
      t.integer :list_id
      t.timestamps
    end
    add_foreign_key :ideas, :lists
  end
end

然后我输入了。
rake db:migrate

有什么想法,为什么我会收到一个错误,说没有列?我还是RoRs的新手。我需要以其他方式添加列吗?

谢谢

7个回答

56

正如Speransky所建议的那样,您不应修改旧的迁移文件。相反,您应创建一个新的迁移,以添加所需的列。例如,在这种情况下,您可以在应用程序中运行以下命令来创建新的迁移:

rails generate migration AddListIdColumnToIdeas list_id:integer

而Rails会自动生成迁移文件,唯一需要做的事情就是运行rake db:migrate

如果你坚持修改旧的迁移文件,你可以像以前一样添加列并运行以下命令:

rake db:drop
rake db:create
rake db:migrate

这将销毁您当前的数据库,创建一个新的数据库并运行所有迁移(其中包括您的新列)。


列已添加,但问题是我无法检索该列的值。 - Awais Usmani
1
如何在我想要的位置添加一列? - Fameless

3

如果您想要向现有数据库添加新列,您应该使用rails generate migration。因此,您可以尝试rails generate migration add_list_id_to_ideas list_id:integer,然后使用rake db:migrate来提交此更改。


2

不应该在旧的迁移中添加新行。迁移是构建数据库的步骤。最后执行的迁移编号存储在schema中,如果您使用rake db:migrate,则不会运行或重新运行它。如果您在创建表格之前运行迁移,则应创建新的迁移,在其中可以使用add_column方法。


1
你还可以这样做...
通过运行以下命令添加列到用户表中: rails g migration add_column_to_users list_id:string 然后运行rake db:migrate
在用户控制器中,还需要添加:list_id属性;
如需了解更多详细信息,请查看http://guides.rubyonrails.org/active_record_migrations.html

1

1
迁移文件名中包含日期时间编码,因此Rails只运行此迁移一次,除非您进行回滚。
迁移的魔力在于使用小步骤构建您的数据库,因此无需在运行rake db:migrate后更新迁移,您应该创建一个新的迁移以对数据库架构进行更改。
记得从旧的迁移文件中删除添加的行,因为如果决定回滚此迁移,它可能会引发错误。

0
如果您已经在迁移文件夹中有文件,您可以在那里添加所需的列(只需键入代码),删除development.sqlite或代表您的db文件的任何内容,然后运行rake db:migrate。然后它将创建一个带有新表列的新sqlite文件,并且您可以在schema.rb中检查它。
因此,基本上,您所做的一切都很好,除了您没有删除数据库文件。对我来说,这样做似乎是最简单的,尽管您将失去数据库中的所有文件。如果您只是测试和开发Rails应用程序,则可以使用此方法。除了我写的内容之外,还有什么问题吗?
编辑:我在这里找到了一个关于这个问题的答案 编辑现有的Rails迁移是否是一个好主意?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接