web-dev-qa-db-fra.com

Perdu mon schéma.rb! Peut-il être régénéré?

En raison de problèmes de déploiement, j'ai arrêté de suivre schema.rb dans git. D'une manière ou d'une autre, j'ai bourré cela et quelque part en cours de route mon fichier schema.rb a disparu.

Existe-t-il un moyen de régénérer schema.rb à partir de la base de données ou des migrations? Je préférerais ne pas perdre les données existantes.

118
brad

Si vous exécutez un rake -T, il répertoriera toutes les tâches de rake possibles pour votre projet Rails. L'un d'eux est db: schema: dump , qui recréera le fichier schema.rb pour l'application Rails à partir de la base de données.

bundle exec rake db:schema:dump
197
mguymon

Prudent,

rake db:schema:dump

videra le schéma de base de données actuel FROM de la base de données. Cela signifie que si vous apportez des modifications à vos migrations, elles ne seront ET NON PAS reflétées dans le fichier schema.rb, qui n'est pas ce que vous souhaitez pour la messagerie instantanée.

Si vous souhaitez recréer le schéma à partir des migrations, procédez comme suit:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate
49
gamov
rake db:schema:dump

Je pense que cela est toujours valable dans Rails 3 - il régénère le fichier schema.rb de la base de données.

11
pschuegr

Rails 5 Way:

Rails db:schema:dump

ou si vous rencontrez Gem :: LoadError then:

bundle exec Rails db:schema:dump

Remarque:  

dans Rails 5, il est recommandé de générer/exécuter les tâches à l'aide de Rails au lieu de rake, ceci étant juste pour rappel, les tâches générées par Rails ont l'extension .rake voir dans lib/tasks/myTask.rake. ce qui signifie que ces tâches peuvent également être exécutées en ajoutant rake au début.

5
Kaleem Ullah

Si vous régénérez schema.rb localement, tout devrait bien se passer. Il contient simplement une représentation de la structure de vos tables de base de données. Les données elles-mêmes ne sont pas contenues dans ce fichier.

Pour régénérer votre fichier schema.rb, exécutez:

bundle exec rake db:schema:dump

Ensuite, validez simplement le nouveau fichier schema.rb et vous devriez être en bonne forme!

4
Graham Swan

Directement à partir du fichier schema.rb lui-même:

Si vous devez créer la base de données d’application sur un autre système, vous devriez utiliser db:schema:load, ne pas exécuter toutes les migrations à partir de rien. Ce dernier est une approche imparfaite et non durable (plus vous accumulerez de migrations, plus il ralentira et plus les risques de problèmes sont grands).

Donc, ne faites PAS la suggestion de rake db:migrate, qui a été suggérée dans - au moment de la rédaction de cet article - la réponse la plus basse.

3
Colin Summers

J'ai également rencontré un problème similaire: mon ancien schéma ne rafraîchissait pas, même si je supprimais la migration.

Donc, ce que j'ai fait a été de supprimer toutes les tables existantes de la base de données et de les migrer à nouveau. L'exécution de la commande "db: schema: load" m'a donné un nouveau fichier schema.rb.

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