2008-10-15 3 views
9

Мне нужно внести изменения в рабочую базу данных. Просто добавьте несколько столбцов. Я внес изменения в базу данных dev с миграциями. Каков наилучший способ обновить производственную базу данных при сохранении существующих данных и не слишком сильно нарушать работу?Rails: лучший способ внести изменения в производственную базу данных

Это MYSQL, и мне нужно будет добавить данные в столбцы, а также для уже существующих записей. Один столбец может иметь значение по умолчанию (оно имеет значение boolean), а другое - временная метка и должно иметь произвольное значение в обратном порядке. Количество строк не огромно.

Так что, если я использую миграции, как добавить данные и как их получить, просто выполните два (или три - я добавлю данные -latest migrations на производственную базу данных, когда она изначально не была построена с помощью миграции (I ? полагаю, что они использовали схему вместо этого)

ответ

6

Это звучит, как вы в состоянии, в котором производство дб схемы Безразлично точно соответствует тому, что вы используете в dev (хотя это не совсем понятно). Я бы нарисовал линию на песке, и получим этот prod db в лучшем состоянии. По существу, вы должны убедиться, что в prod db есть таблица «schema_info», в которой перечислены все миграции, которые вы> < когда-либо хотите запускать на производстве. Затем вы можете добавить миграции в свой контент, и они будут работать против производства db.

После того, как вы это сделали, вы можете написать миграцию, которая добавляет изменения схемы или добавлять данные, но вам нужно быть очень осторожными, так как если вы добавляете данные с помощью миграции, вы должны определить модель в рамках миграции сам, как это:

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 ...», миграция вызовет исключение, которое является большой болью.

4

есть причина, вы не используете ту же миграцию, которые вы использовали в своей среде Dev

+2

База данных уже используется, поэтому я не хочу потерять существующие данные и предпочел бы не тратить время на восстановление и повторное заполнение, если я могу избежать этого. – srboisvert 2008-10-15 18:22:41

+0

Итак, миграция разрушительна? Или вы в настоящее время используете миграции, но никогда не использовали их на производстве раньше, и поэтому он попытается выполнить * все * миграции, некоторые из которых старше и больше не актуальны и, следовательно, могут вызвать проблемы? – Matt 2008-10-15 18:25:19

2

Добавление столбца с add_column в миграции должна быть неразрушающими: это будет сгенерируйте оператор «ALTER TABLE». Если вы знаете, что собираетесь разместить в столбцах после создания, вы можете заполнить значения в рамках миграции (вы можете выбрать менее трудоемкую альтернативу, если количество строк равно l АРГЕ).

Удаление или изменение определения столбца, я думаю, зависит от платформы: некоторые из них позволят удалить столбец на месте, а другие будут выполнять последовательность команд rename-create-select-drop.

Чтобы получить более конкретную информацию, нам нужна дополнительная информация: какой вид миграции вы просматриваете, на какой платформе вы работаете, вам нужно установить значения как часть миграции? Подобные вещи очень помогли бы - просто отредактируйте вопрос, который подтолкнет его к списку.

14

Я всегда следовать этой процедуре:

  • Dump лезвие базе данных с MySQLDump командой
  • Populate DEV/тестовая базой данных с отвалом с помощью команды MySQL
  • Run миграции в разработчике/тест
  • Проверка миграция работала
  • База данных dump prod с командой mysqldump (как она могла быть изменена), сохраняя резервную копию на сервере
  • Запуск миграции на прод (с использованием capristano)
  • Тест миграции работал на прод
  • пить пиво (во время просмотра журналов ошибок)