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

知道为什么我会收到一个错误说没有专栏吗?我还是 RoR 的新手。我必须以其他方式添加一列吗?

谢谢

4

7 回答 7

56

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

rails generate migration AddListIdColumnToIdeas list_id:integer

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

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

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

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

于 2013-04-28T05:02:38.253 回答
3

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

于 2013-04-28T05:06:19.343 回答
2

您不应该将新行添加到旧迁移中。迁移是构建数据库的一个步骤。并且最后执行的迁移次数存储在schema里面,如果你使用将不会运行或重做rake db:migrate。如果您之前通过创建表来运行迁移,那么您应该在可以使用add_column方法的地方创建新的迁移。

于 2013-04-28T04:45:36.577 回答
1

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

这里是迁移的魔力,可以通过小步骤构建您的数据库,因此无需在运行 rake db:migrate 后更新迁移,您应该进行新的迁移来对您的数据库架构进行您想要的更改

并记得

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

于 2013-04-28T05:04:09.017 回答
1

Rails 4.0添加单列或多列的简单方法 https://gist.github.com/pyk/8569812

于 2015-05-29T11:34:19.647 回答
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

于 2017-04-04T07:50:50.593 回答
0

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

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

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

于 2016-06-03T00:20:18.187 回答