ruby-on-rails – Rails:对生产数据库进行更改的最佳方式

我需要对使用中的生产数据库进行更改.只需添加几列.我已经通过迁移对dev数据库进行了更改.什么是更新生产数据库,同时保留现有数据并且不会中断操作太多的最佳方法

这是MysqL,我也需要将数据添加到列中以及已有的记录.一列可以有一个默认值(它是布尔值),另一列是一个时间戳,应该有任意的后缀值.行数不是很大.

所以如果我使用迁移,我如何添加数据,我该如何做到这两个(或三 – 我添加数据-latest迁移在生产db当它最初没有通过迁移构建(我相信他们使用架构)?

解决方法

这听起来像是处于生产数据库架构不完全匹配您在开发中使用的状态(尽管不完全清楚).我会在沙滩上画一条线,并使得这个prod db处于更好的状态.基本上你想要做的是确保prod数据库有一个“schema_info”表,其中列出了您不要&曾经想要在生产中运行.然后,您可以将迁移添加到您的内容中,并且它们将针对生产数据库.

完成之后,您可以编写添加模式更改或添加数据的迁移,但需要非常小心的一件事是,如果使用迁移添加数据,则必须在迁移本身内定义模型,如此:

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 …上定义用户类,迁移将会引发异常,这是一个很大的痛苦.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...