web-dev-qa-db-fra.com

rake db: schéma: charge vs migrations

Très simple question ici: si les migrations peuvent devenir lentes et lourdes à mesure qu’une application devient plus complexe et si nous avons le rake db:schema:load beaucoup plus propre à appeler à la place, pourquoi les migrations existent-elles?

Si la réponse à ce qui précède est que les migrations sont utilisées pour le contrôle de version (enregistrement pas à pas des modifications apportées à la base de données), alors à mesure que l'application devient plus complexe et que rake db:schema:load est utilisé davantage, conservent-ils leur fonction principale?


Mise en garde:

Des réponses à cette question: rake db:schema:load va effacer les données sur un serveur de production, soyez donc prudent lorsque vous l’utilisez.

155
sscirrus

Les migrations apportent des modifications pas à pas à la base de données. Dans un environnement de production, des modifications incrémentielles doivent être apportées à la base de données lors des déploiements: les migrations fournissent cette fonctionnalité avec une sécurité intégrée de restauration. Si vous exécutez rake db:schema:load sur un serveur de production, vous supprimez toutes vos données de production. C'est une habitude dangereuse à prendre.

Cela étant dit, j'estime que, parfois, il est «effondré» les migrations. Cela implique la suppression des anciennes migrations, leur remplacement par une seule migration (très similaire à votre fichier schema.rb) et la mise à jour de la table schema_migrations pour refléter ce changement. Soyez très prudent lorsque vous faites cela! Vous pouvez facilement supprimer vos données de production si vous ne faites pas attention.

En remarque, je crois fermement qu'il ne faut jamais mettre la création de données dans les fichiers de migration. Le fichier seed.rb peut être utilisé pour cela, ou pour créer des tâches de rake ou de déploiement. Cette intégration dans les fichiers de migration associe la spécification de schéma de votre base de données à celle de vos données et peut générer des conflits lors de l'exécution des fichiers de migration. 

191
jesse reiss

Je suis tombé par hasard sur ce message, c'était il y a longtemps et je n'ai pas vu la réponse à laquelle je m'attendais.

rake db:schema:load est idéal pour la première fois que vous mettez un système en production. Après cela, vous devez exécuter les migrations normalement.

Cela vous aide également à nettoyer vos migrations à tout moment, car le schéma contient toutes les informations pour mettre en production d'autres machines, même lorsque vous avez nettoyé vos migrations.

28
ereslibre

Les migrations vous permettent également d'ajouter des données à la base de données. mais db: schema: load ne charge que le schéma.

9
Shaunak

Parce que les migrations peuvent être annulées et fournir des fonctionnalités supplémentaires. Par exemple, si vous devez modifier certaines données dans le cadre d'un changement de schéma, vous devez le faire en tant que migration. 

5
Jamie Penney

En tant qu'utilisateur d'autres ORM, il m'a toujours paru étrange que Rails ne dispose pas d'une fonctionnalité de «synchronisation et mise à jour». En d'autres termes, en utilisant le fichier de schéma (qui représente l'ensemble du schéma à jour), parcourez la structure de base de données existante et ajoutez/supprimez des tables, des colonnes et des index selon les besoins.

Pour moi, cela serait beaucoup plus robuste, même s’il était peut-être un peu plus lent.

4
Dan James

rake db:migrate configure les tables dans la base de données. Lorsque vous exécutez la commande de migration, elle recherchera dans db/migrate/tous les fichiers Ruby et les exécutera en commençant par le plus ancien. Un horodatage se trouve au début de chaque nom de fichier de migration.

Contrairement à rake db:migrate qui exécute des migrations non encore exécutées, rake db:schema:load charge le schéma déjà généré dans db/schema.rb dans la base de données.

Vous pouvez en savoir plus sur les commandes de la base de données rake ici .

0
Nesha Zoric

J'ai déjà posté comme commentaire, mais je pense qu'il est préférable de mettre les commentaires du fichier db/schema.rb ici:

# 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.

En fait, mon expérience est qu'il vaut mieux mettre les fichiers de migration dans git et non le fichier schema.rb ...

0
user1251840