我需要改变正在使用的生产数据库。只增加几列。我做了修改,以开发数据库迁移。什么是最好的方式来更新生产数据库,同时保留现有数据并不中断操作太多了?

这是MYSQL和我将需要添加数据以列,以及已有的记录。一个列可以有一个默认值的(这是布尔),但其他一个时间戳,并应具有任意的追溯值。该行数不是巨大的。

所以,如果我使用的移徙如何添加数据以及如何获得它刚刚做了两个(或三添加数据的最新迁移的生产数据库时,它不是最初修建经由迁移(我相信他们使用的架构,而不是)?

有帮助吗?

解决方案

听起来你处于这样一种状态,即生产数据库模式与你在开发中使用的模式不完全匹配(虽然它并不完全清楚)。我会在沙子中划一条线,让那个prod db处于更好的状态。基本上你要做的是确保prod db有一个<!> quot; schema_info <!> quot;列出您<!> gt;不<!> lt;的任何迁移的表格曾经想要在生产中运行。然后,您可以将迁移添加到您的内容中,它们将对生产数据库起作用。

完成后,您可以编写添加架构更改或添加数据的迁移,但您需要特别注意的一件事是,如果使用迁移添加数据,则必须在迁移本身内定义模型,像这样:

class AddSomeColumnsToUserTable < ActiveRecord::Migration
  class User < ActiveRecord::Base; end
  def self.up
    add_column :users, :super_cool, :boolean, :default => :false
    u = User.find_by_login('cameron')
    u.super_cool = true
    u.save
  end

  def self.down
    remove_column :users, :super_cool
  end
end

这样做的原因是,在将来,您可能会在某些重构或其他过程中完全删除模型。如果您没有在行<!>上定义用户类,则“User.find_by_login ... <!>”;迁移将引发异常,这是一个巨大的痛苦。

其他提示

我总是遵循这一程序:

  • 倾倒的产品数据库用快照命令
  • 填充dev/测试数据库转储使用mysql命令
  • 运行迁移在dev/测试
  • 检查迁移工作
  • 倾倒的产品数据库用快照命令(因为它可能会有更改)保留的备份服务器上
  • 运行迁移上产(使用capristano)
  • 测试迁移工作prod
  • 喝啤酒(同时观看的错误日志)

您是否有理由不使用在开发环境中使用的相同迁移?

在迁移中添加带有add_column的列应该是非破坏性的:它将生成<!>“ALTER TABLE <!>”;声明。如果您知道在创建后将要放入列中的内容,则可以在迁移中填写值(如果行数很大,您可以选择耗时较少的替代值)。

我认为删除或更改列的定义取决于平台:有些将允许删除列,其他人将执行rename-create-select-drop命令序列。

为了更具体,我们需要更多信息:您正在查看哪种迁移,您运行的是哪个平台,是否需要在迁移过程中设置值?这样的东西会有很多帮助 - 只需编辑问题,这会将其推回到列表中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top