rake db: schema: carga x migrações

171

Pergunta muito simples aqui - se as migrações podem ficar lentas e complicadas, pois um aplicativo fica mais complexo e se temos muito mais limpo rake db:schema:load para ligar, por que as migrações existem?

Se a resposta para o exposto acima é que as migrações são usadas para controle de versão (um registro gradual de alterações no banco de dados), então, quando um aplicativo se torna mais complexo e rake db:schema:loadmais usado, eles continuam mantendo sua função principal?


Cuidado:

Das respostas a esta pergunta: rake db:schema:load excluirá os dados em um servidor de produção, portanto, tenha cuidado ao usá-los.

sscirrus
fonte
5
+1 nunca entendi o objetivo das migrações; por que não apenas controlar a versão do esquema?
alternativa
5
@alternative - as migrações permitem que você faça outras coisas, como se você precisar adicionar uma coluna não nula, poderá preenchê-la com dados de maneira inteligente, em vez de usar algum valor padrão.
Josh M.

Respostas:

208

As migrações fornecem mudanças de passo para frente e para trás no banco de dados. Em um ambiente de produção, mudanças incrementais devem ser feitas no banco de dados durante as implantações: as migrações fornecem essa funcionalidade com uma reversão à prova de falhas. Se você correrrake db:schema:load em um servidor de produção, acabará excluindo todos os seus dados de produção. Este é um hábito perigoso de se entrar.

Dito isto, acredito que é uma prática decente ocasionalmente "colapsar" migrações. Isso implica excluir migrações antigas, substituí-las por uma única migração (muito semelhante ao seu schema.rbarquivo) e atualizar a schema_migrationstabela para refletir essa alteração. Tenha muito cuidado ao fazer isso! Você pode excluir facilmente seus dados de produção se não for cuidadoso.

Como observação lateral, acredito firmemente que você nunca deve colocar a criação de dados nos arquivos de migração. O seed.rbarquivo pode ser usado para isso, ou tarefas personalizadas de rake ou deploy. Colocar isso nos arquivos de migração combina a especificação do esquema do banco de dados com a especificação dos dados e pode levar a conflitos ao executar os arquivos de migração.

Jesse Reiss
fonte
80
obrigado por informar que rake db: schema: load exclui todos os dados de produção!
Magne
2
Em vez de substituir as migrações "recolhidas" por uma nova que imita o esquema, escrevi uma gema que as limpa e solicita aos usuários que usem db:schema:loadse tentarem executar db:migrateuma nova instalação. @ clear_migrations
Yarin
provavelmente uma resposta óbvia, mas antes do primeiro envio à produção, você recomendaria apenas excluir todas as migrações e usar o db.schema como a primeira migração?
DTC
30

Apenas tropecei neste post, que foi há muito tempo e não vi a resposta que eu estava esperando.

rake db:schema:loadé ótimo pela primeira vez em que você coloca um sistema em produção. Depois disso, você deve executar as migrações normalmente.

Isso também ajuda a limpar suas migrações sempre que você quiser, pois o esquema possui todas as informações para colocar outras máquinas em produção, mesmo quando você limpou suas migrações.

ereslibre
fonte
Para que você possa "limpar" suas migrações porque nunca precisa usá-las? Soa como uma afirmação bizarra.
Abe Petrillo
Não está claro para mim o que o benefício db:schema:loadtem além de diminuir alguns segundos uma vez durante o ciclo de desenvolvimento. Você já trabalhou com um aplicativo que levou mais de 30 segundos para ser construído? Atualmente, estou trabalhando em um aplicativo que possui bugs em seus arquivos de migração e nunca será migrado sem ter correções ou execuçãodb:schema:load que me faz pensar no esquema: a carga é para quando algo dá errado no desenvolvimento do aplicativo.
Ninjaxor
Outro argumento que eu faria para manter as migrações é que a equipe principal do Rails direciona os usuários instead of editing schema.rb, please use the migrations feature. Portanto, se você estiver executando db:schema:loadem um arquivo gerado automaticamente e não tiver mais migrações para gerar automaticamente novamente, estará efetivamente seguindo o caminho de "editar" manualmente o esquema e desativar as migrações. Eu gostaria de ter uma citação do guia rails sobre isso, mas eles não discutem o schema: load, o que aumenta assustadoramente minha frustração ao decidir como abordar o recurso schema: load. = /
Ninjaxor
Eu vim a esta página precisamente porque concordo com isso. Minha experiência é que, quando o site está em produção, é muito mais seguro usar migrações para alterá-lo. Apesar disso, os comentários do início de db / schema.rb indicam precisamente o contrário! (Eu tenho o problema no início de cada projeto porque esqueci de colocar db / schema.rb no arquivo .gitignore ...)
user1251840
@AbePetrillo uau, eu perdi esses comentários completamente. Claro que não, o que eu quis dizer é que você pode limpar velho migrações que foram executadas em todas as máquinas de produção, se desejar. Ao longo dos anos, eu sempre os mantive por perto, mas minha declaração "ajuda você a limpar suas migrações sempre que quiser" não significava que "eu nunca precisaria usar migrações". Portanto, ao implantar uma nova máquina, execute rake db:schema:loado contrário rake db:migrate. Então a partir daí, você pode rake db:migrate.
ereslibre
9

Migrações também permite adicionar dados ao banco de dados. mas db: schema: load apenas carrega o esquema.

Shaunak
fonte
6

Porque as migrações podem ser revertidas e fornecem funcionalidade adicional. Por exemplo, se você precisar modificar alguns dados como parte de uma alteração de esquema, será necessário fazer isso como uma migração.

Jamie Penney
fonte
4

Como usuário de outros ORMs, sempre me pareceu estranho o Rails não ter um recurso de 'sincronização e atualização'. ou seja, usando o arquivo de esquema (que representa todo o esquema atualizado), passe pela estrutura existente do banco de dados e adicione / remova tabelas, colunas e índices conforme necessário.

Para mim, isso seria muito mais robusto, mesmo que possivelmente um pouco mais lento.

Dan James
fonte
1
A tarefa de migrar o banco de dados com dados de um esquema complicado para outro não é trivial algumas vezes. Pode não ser resolvido automaticamente e os dados não podem ser migrados consistentemente com uma única etapa. A migração do Rails é mestre e o esquema é dependente. O esquema é recriado automaticamente a cada migração, mas não vice-versa.
Ok 26/03
Os próprios guias do Rails afirmam explicitamente que schemaé o mestre, não as migrações.
Drenmi
0

Eu já publiquei como comentário, mas acha melhor colocar os comentários do arquivo db / schema.rb aqui:

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

Na verdade, minha experiência é que é melhor colocar os arquivos de migração no git e não no arquivo schema.rb ...

user1251840
fonte
0

rake db:migrateconfigure as tabelas no banco de dados. Quando você executa o comando de migração, ele procura no db / migrate / os arquivos ruby ​​e os executa começando pelo mais antigo. Há um registro de data e hora no início de cada nome de arquivo de migração.

Ao contrário do rake db:migrateque executa migrações que ainda não foram executadas, rake db:schema:loadcarrega o esquema já gerado no db/schema.rbbanco de dados.

Você pode descobrir mais sobre os comandos do banco de dados rake aqui .

Nesha Zoric
fonte