Perdi meu schema.rb! Pode ser regenerado?

133

Devido a alguns problemas de implantação, parei de rastrear schema.rb no git. De alguma forma, eu já recolhi isso e, em algum lugar do caminho, meu arquivo schema.rb desapareceu.

Existe uma maneira de regenerar schema.rb do banco de dados ou das migrações? Eu preferiria não perder os dados existentes.

Brad
fonte

Respostas:

230

Se você executar um rake -T, listará todas as tarefas possíveis de rake para o seu projeto Rails. Um deles é db: schema: dump, que recriará o schema.rb para o aplicativo Rails a partir do banco de dados.

bundle exec rake db:schema:dump
mguymon
fonte
Muito obrigado, muitas respostas, mas parece que você foi o primeiro (apenas), então marque para você. Apenas curioso, isso gera o esquema a partir do próprio banco de dados ou das migrações?
brad
7
No próprio banco de dados, tenha cuidado se houver alterações que ocorreram fora das migrações.
mguymon
1
schema.rb ainda contém esquema vazia após rake db:schema:dumpon rails 2.0
Will Hardwick-Smith
Meu arquivo schema.rb permanece exatamente o mesmo depois de executar os comandos acima
stevec
59

Cuidado,

rake db:schema:dump

irá despejar o esquema atual do banco de dados a partir do banco de dados . Isso significa que, se você fez alterações nas migrações, elas NÃO serão refletidas no arquivo schema.rb, que não é o que você deseja IMO.

Se você deseja recriar o esquema a partir das migrações, faça o seguinte:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate
Gamov
fonte
1
Isso resultaria em perda de dados, que o OP disse que queria evitar. Além disso, como Colin aponta, a regeneração do banco de dados puramente a partir das migrações é potencialmente uma péssima idéia, devido à maior possibilidade de se deparar com problemas de dependência estranhos (de modo geral). Se houver migrações pendentes, provavelmente seria melhor executar essas últimas migrações na máquina de desenvolvimento e, em seguida, executar o rake db:schema:dumpcomando.
Paul Richter
4
Cada tela é explicada claramente na minha resposta. Eu fui mordido EXATAMENTE executando apenas o esquema: dump e não obtendo um esquema limpo. O OP está falando sobre o rastreamento do esquema em um CVS. Eu gostaria de ter meu esquema alinhado com as minhas definições em meus migrações e não uma versão obsoleta de uma produção DB ou um velho desenvolvimento DB
Gamov
11
rake db:schema:dump

Eu acho que isso ainda é válido no Rails 3 - ele regenera o schema.rb do banco de dados.

pschuegr
fonte
8

TRILHOS 5 Vias:

rails db:schema:dump

ou se você encontrar Gem :: LoadError, então:

bundle exec rails db:schema:dump

Nota:

no rails 5, é recomendável que a tarefa seja gerada / executada usando, em railsvez de rake, isso é apenas para lembrar, a tarefa gerada no rails é de extensão, .rakeconsulte lib/tasks/myTask.rake. o que significa que essas tarefas também podem ser executadas anexando-as rake.

Kaleem Ullah
fonte
5

Se você regenerar schema.rblocalmente, você deve ficar bem. Ele simplesmente mantém uma representação da estrutura de suas tabelas de banco de dados. Os dados em si não estão contidos neste arquivo.

Para regenerar seu schema.rbarquivo, execute:

bundle exec rake db:schema:dump

Em seguida, basta confirmar o novo schema.rbarquivo e você estará em boa forma!

Graham Swan
fonte
4

Diretamente do próprio arquivo schema.rb:

Se você precisar criar o banco de dados do aplicativo em outro sistema, deve estar usando db:schema:load, não executando todas as migrações do zero. A última é uma abordagem falha e insustentável (quanto mais migrações você realizar, mais lenta será a execução e maior probabilidade de problemas).

Portanto, NÃO faça a sugestão de rake db:migrate, que foi sugerida na - no momento da redação deste texto - a resposta nominal mais baixa.

Colin Summers
fonte
Você provavelmente desejaria executar as últimas migrações pendentes, se houver alguma na sua máquina de desenvolvimento antes de regenerar o esquema, mas sim, regenerar o banco de dados apenas a partir das migrações é uma péssima idéia, especialmente porque isso resultaria em perda de dados.
Paul Richter
1

Eu também tive um problema semelhante em que meu esquema antigo não era atualizado, mesmo que eu excluísse a migração.

Então, o que eu fiz foi soltar todas as tabelas existentes no banco de dados e migrá-las novamente. A execução do comando "db: schema: load" me deu um novo schema.rb.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
R.Cha
fonte