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

时间:2013-04-28 04:43:49

标签: ruby-on-rails ruby ruby-on-rails-3 migration rails-migrations

我收到了一个错误:

SQLite3::SQLException: no such column: ideas.list_id: 
SELECT "ideas".* FROM "ideas"  
WHERE "ideas"."list_id" = 2

但我添加了

t.integer :list_id

到我的db迁移文件:

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

知道为什么我会收到一条错误,说没有列?我还是RoR的新人。我是否必须以其他方式添加列?

由于

7 个答案:

答案 0 :(得分:52)

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

rails generate migration AddListIdColumnToIdeas list_id:integer

Rails会自动生成迁移文件,剩下要做的就是运行rake db:migrate

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您不应向旧迁移添加新行。迁移是构建数据库的一个步骤。上次执行的迁移次数存储在schema中,如果您使用rake db:migrate,则不会运行或重做。如果您之前使用创建表运行迁移,那么您应该创建新的迁移,您可以使用add_column方法。

答案 3 :(得分:1)

迁移文件名在其名称中编码了日期时间,因此rails运行此迁移,并且除非您执行回滚,否则不再运行它

这里出现了迁移的神奇之处,即使用小步骤构建数据库,因此在运行rake db:migrate之后无需更新迁移,您应该进行新的迁移以执行您想要的数据库模式的更改

并记得

从旧的迁移文件中删除添加的行,因为如果您决定回滚此迁移,它可能会引发错误

答案 4 :(得分:1)

Rails 4.0轻松实现添加单列或多列 https://gist.github.com/pyk/8569812

答案 5 :(得分:1)

您也可以这样做..

rails g migration add_column_to_users list_id:string

然后rake db:migrate

用户控制器中的add :list_id属性;

了解更多详情,请查看http://guides.rubyonrails.org/active_record_migrations.html

答案 6 :(得分:0)

如果您的migrate文件夹中已有文件,您只需添加所需的列(只需键入代码),删除development.sqlite或代表您的db文件的任何文件,然后运行rake db:migrate。 然后它将在表中创建一个带有新列的新sqlite文件,您可以在schema.rb中检查它。

所以,基本上,你所做的一切似乎都很好,除了你没有删除你的数据库文件。 这样做对我来说似乎最简单,尽管你会丢失数据库中的所有文件。如果你只是测试和开发Rails应用程序,这是有效的。 除了我写的内容之外,还有人会评论这种方法是否有问题吗?

编辑:我实际上在这里找到了答案 Editing Existing Rails Migrations is a good idea?