Pergunta

Eu preciso fazer alterações em um banco de dados de produção em uso. Basta adicionar algumas colunas. Fiz as alterações para o banco de dados dev com as migrações. Qual é a melhor maneira de atualizar o banco de dados de produção, preservando os dados existentes e não perturbar o funcionamento demais?

É de MYSQL e eu vou ser a necessidade de adicionar dados para as colunas, bem como para registros já existentes. Uma coluna pode ter um valor padrão (é boolean), mas o outro é um timestamp e deve ter um valor retroativa arbitrária. As contagens de linha não são enormes.

Então, se eu usar as migrações como faço para adicionar dados e como faço para obtê-lo apenas para fazer os dois (ou três - eu adicionar dados -latest migrações no db de produção quando não foi inicialmente construído através de migrações (eu acredito eles usaram o esquema em vez)?

Foi útil?

Solução

Parece que você está em um estado onde o esquema db de produção não corresponde exatamente o que você está usando no dev (embora não seja totalmente claro). Eu desenhar uma linha na areia, e conseguir que db prod em um estado melhor. Essencialmente, o que você quer fazer é se certificar de que a db prod tem uma mesa "schema_info" que as listas quaisquer migrações que você> não

Uma vez que você fez que você pode escrever migrações que agregam as alterações do esquema ou adicionar dados, mas uma coisa que você precisa ser realmente cuidadoso sobre é que se você adicionar dados usando uma migração, é necessário definir o modelo dentro da própria migração , como este:

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

A razão para isso é que, no futuro, você pode remover o modelo por completo, durante algum refactoring ou outro. Se você não definir a classe de usuário on-line "User.find_by_login ..." a migração irá lançar uma exceção que é uma grande dor.

Outras dicas

Eu sempre siga este procedimento:

  • banco de dados de despejo prod com o comando mysqldump
  • Preencher dev / banco de dados de teste com despejo usando o comando mysql
  • Executar migrações em dev / teste
  • Verifique migração funcionou
  • banco de dados de despejo prod com o comando mysqldump (como ele pode ter mudado) manter de backup no servidor
  • migrações executado em prod (usando Capristano)
  • migração
  • Test trabalhou em prod
  • Beber cerveja (enquanto assistia logs de erros)

Existe uma razão que você não está usando as mesmas migrações que você usou em seu ambiente dev?

Adicionando uma coluna com add_column em uma migração deve ser não destrutivo: ele irá gerar uma declaração "ALTER TABLE". Se você sabe o que você está indo para colocar nas colunas, uma vez criado, você pode preencher os valores dentro do migração (você pode escolher uma alternativa menos demorado se as contagens de linha são grandes).

Retirar ou alterar a definição de uma coluna é, penso eu, dependente de plataforma:. Alguns vão permitir a exclusão de uma coluna no lugar, os outros vão realizar uma seqüência de renomeação-create-select-gota de comandos

Para ser mais específico, precisamos de mais informações: que tipo de migração que você está olhando, que plataforma você está executando, você precisa para valores definidos como parte da migração? Coisas assim ajudaria muito -. Basta editar a questão, que vai empurrá-lo backup da lista

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top