0

我需要在我的架构中的表中添加一些列。有人能告诉我最好的方法吗?

以下内容似乎不完整或错误,因为 schema.rb 文件未更新以包含新列,并且所有相应的视图文件(编辑、索引、新建、显示)未更新以包含新列。更不用说生成的所有迁移类的膨胀了。谢谢

ruby script/generate migration RecordLabelToAlbums record_label:string
      exists  db/migrate
      create  db/migrate/20121130125859_record_label_to_albums.rb

创建这个:

class RecordLabelToAlbums < ActiveRecord::Migration
def self.up
end

def self.down
 end
end

然后我添加了这个:

class RecordLabelToAlbums < ActiveRecord::Migration
def self.up
   add_column :albums, :record_label, :text
end

def self.down
   remove_column :albums, :record_label
end

end

我跑了:

rake db:migrate

得到这个:Mysql::Error: 表'albums'已经存在:CREATE TABLE albums( idint(11) DEFAULT NULL auto_increment PRIMARY KEY, created_atdatetime, updated_atdatetime)

4

1 回答 1

1

您添加的代码是正确的。

该错误表明,由于某种原因,您的系统似乎认为它尚未运行创建专辑表的原始迁移。迁移的状态(在 Rails 2 中)在名为的数据库中的一个表中指定schema_migrations——如果这变得混乱,那么它将尝试重新运行迁移。我不确定是什么导致它感到困惑,但我确实记得在 2008 年我使用 Rails 2.x 时发生过几次。

该表很简单——您可以从 SQL 提示符中查看其中的内容——我认为只是它认为已经运行的迁移的名称。

如果您不介意丢失一些数据,您可以尝试rake db:rollback甚至rake db:reset回到开始。 rake db:rollback STEP=2将回滚最后 2 次迁移。

如果您需要数据,请通过添加一条或多条引用app/db/migrations可能已丢失的迁移的新记录来更正表的内容。我认为顺序很重要(Rails 3 中的格式略有变化,我不记得如何)。

任何时候您想添加或更改数据库架构,使用 rails 生成迁移,然后在rake db:migrate准备就绪后运行。

只是问:有什么方法可以迁移到 Rails 3。它已经推出多年了,Rails 4 即将推出。如果你不接受打击和升级,你会发现自己陷入了不兼容、弃用、安全和性能问题等等的死水。

于 2012-11-30T14:17:27.047 回答