0

je courais simple rails la migration sur un grand mysql2 db pour ajouter une colonne à une table:migration Rails semble terminée, mais rake montre encore la migration comme étant en attente

class AddMiddleNameToPerson < ActiveRecord::Migration[5.0] 
    def change 
    add_column :person, :middle_name, :string 
    end 
end 

J'ai été déconnecté du serveur exécutant les rails application pendant la migration. Je puis rebranché et vérifié l'état de la migration avec bundle exec rake db:migrate:status, qui a montré que vers le bas:

down 20170424182410 Add middle name to person 

Je suppose qu'il était encore en cours d'exécution en arrière-plan. Donc je l'ai laissé pendant un certain temps, et éventuellement en utilisant la console rails j'ai vérifié que person.middle_name était accessible sur les objets. Cependant, db:migrate:status montre encore la migration vers le bas, et si je tente de lancer db:migrate à nouveau je reçois une erreur:

Mysql2::Error: Duplicate column name 'middle_name' 

Il semble donc que la nouvelle colonne est dans la base de données, et accessible par ActiveRecord, mais rake db:migrate:status découvertes la migration en tant que down et rake db:migrate tente de le réexécuter, sans succès.

Répondre

1

S'il s'agit d'une base de données de production (ou d'une autre base de données avec des données importantes) alors ne pasrake db:reset car cela entraînera une perte de la base de données et vous perdrez tout; aussi ne pasdb:migrate:down comme cela va laisser tomber la colonne middle_name et vous perdrez tous les prénoms que vous avez déjà.

D'abord obtenir une sauvegarde de la base de données ou au moins la table avec laquelle vous travaillez. Ensuite, connectez-vous à la base de données avec l'outil CLI mysql et indiquez describe people;. L'information dans votre question suggère que vous verrez la colonne middle_name là dedans mais il ne blesse pas pour vous assurer que vous vous connectez à la bonne base de données. Si middle_name n'est pas là alors vous vous connectez certainement à la mauvaise base de données quelque part, si elle est là alors vous avez juste un problème de migration à nettoyer.

Vous dites que la connexion à la base de données a été abandonnée avant la fin de la migration. Les migrations fonctionnent dans cette séquence:

  1. Exécutez la migration pour mettre à jour la base de données.
  2. Enregistrez le numéro de version de la migration dans la table schema_migrations.
  3. Régénérer db/schema.rb ou db/structure.sql.

Si finalise mais la connexion est perdue alors ne se reproduise jamais si la migration aura courir, mais Rails ne saura pas.

Si aucun autre environnement ont besoin de la migration, vous pouvez simplement supprimer la migration et rake db:schema:dump ou rake db:structure:dump pour obtenir une nouvelle schema.rb ou structure.sql. Les migrations ne sont que des bits de code temporaires pour vous déplacer de A à B, les supprimer une fois qu'elles ont été exécutées partout (et même recommandé), tout ce qui compte est la structure de votre base de données (db/schema.rb ou db/structure.sql).

Si d'autres environnements doivent exécuter la migration, vous pouvez appliquer manuellement le tableau schema_migrations; Connectez-vous à la base de données avec l'outil CLI mysql et dites insert into schema_migrations (version) values ('20170424182410');. Rails sait maintenant que la migration a été exécutée et que les futurs appels rake db:migrate seront heureux. Ensuite, vous voudrez rafraîchir votre schema.rb (avec rake db:schema:dump) ou structure.sql (avec rake db:structure:dump).


Vous avez probablement un fichier db/schema.rb pour le suivi de la structure de votre base de données (y compris les numéros de version des migrations qui ont été exécutées). Si vous le faites, vous utiliserez rake db:schema:dump pour le régénérer. Si vous avez db/structure.sql alors vous utiliseriez rake db:structure:dump.

+0

J'ai fini par faire quelque chose de similaire à cela pour le résoudre. Acceptant. – wildabeast