J'ai perdu mon schema.rb! Peut-il être régénéré?

133

En raison de certains 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.

Brad
la source

Réponses:

230

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

bundle exec rake db:schema:dump
mguymon
la source
Un grand merci, beaucoup de réponses mais on dirait que vous étiez le premier (juste), alors cochez pour vous. Curieux, cela génère-t-il le schéma à partir de la base de données elle-même ou des migrations?
brad
7
À partir de la base de données elle-même, soyez donc prudent si des modifications se sont produites en dehors des migrations.
mguymon
1
schema.rb contient toujours un schéma vide après rake db:schema:dumpsur les rails 2.0
Will Hardwick-Smith
Mon fichier schema.rb reste exactement le même après l'exécution des commandes ci-dessus
stevec
59

Prudent,

rake db:schema:dump

va vider le schéma de base de données actuel de la base de données . Cela signifie que si vous avez apporté des modifications à vos migrations, elles ne seront PAS reflétées dans le fichier schema.rb, ce qui n'est pas ce que vous voulez IMO.

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
gamov
la source
1
Cela entraînerait une perte de données, ce que l'OP a déclaré vouloir éviter. De plus, comme le souligne Colin, la régénération de la base de données uniquement à partir des migrations est potentiellement une très mauvaise idée en raison de la possibilité accrue de rencontrer des problèmes de dépendance étranges (en général). S'il y a des migrations en attente, il serait probablement préférable d'exécuter ces dernières migrations sur la machine de développement, puis d'exécuter la rake db:schema:dumpcommande.
Paul Richter
4
Chaque toile est clairement expliquée dans ma réponse. J'ai été mordu EXACTEMENT en exécutant uniquement schema: dump et en n'obtenant pas un schéma propre. L'OP parle de suivre le schéma dans un CVS. Je souhaite que mon schéma soit aligné sur mes définitions dans mes migrations et non sur une version obsolète d'une base de données de production ou d'une ancienne base de données de développement
gamov
11
rake db:schema:dump

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

pschuegr
la source
8

RAILS 5 voies:

rails db:schema:dump

ou si vous rencontrez Gem :: LoadError alors:

bundle exec rails db:schema:dump

Remarque:

dans rails 5, il est recommandé que les tâches soient générées / exécutées en utilisant railsau lieu de rake, ceci est juste pour se rappeler, les tâches générées par les rails sont d'extension .rakevoir dans lib/tasks/myTask.rake. ce qui signifie que ces tâches peuvent également être exécutées en préfixant rake.

Kaleem Ullah
la source
5

Si vous vous régénérez schema.rblocalement, tout va bien. 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 schema.rbfichier, exécutez:

bundle exec rake db:schema:dump

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

Graham Swan
la source
4

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 devez utiliser db:schema:loadet non exécuter toutes les migrations à partir de zéro. Cette dernière approche est imparfaite et non durable (plus vous amasserez de migrations, plus elle sera lente et plus il y aura de problèmes).

Alors ne faites PAS la suggestion de rake db:migrate, qui a été suggérée dans la réponse la moins bien notée au moment de la rédaction de cet article.

Colin Summers
la source
Vous voudrez probablement exécuter les dernières migrations en attente s'il y en a sur votre machine de développement avant de régénérer le schéma, mais oui, régénérer la base de données uniquement à partir des migrations est une très mauvaise idée, d'autant plus que cela entraînerait une perte de données.
Paul Richter
1

J'ai également eu un problème similaire où mon ancien schéma ne se rafraîchissait pas même si je supprimais la migration.

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

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