Question

Je dois apporter des modifications à une base de données de production en cours d'utilisation. Il suffit d'ajouter quelques colonnes. J'ai apporté les modifications à la base de données dev avec les migrations. Quel est le meilleur moyen de mettre à jour la base de données de production tout en préservant les données existantes et en ne perturbant pas trop les opérations?

C'est MYSQL et j'aurai besoin d'ajouter des données aux colonnes pour les enregistrements déjà existants. Une colonne peut avoir une valeur par défaut (c'est un booléen), mais l'autre est un horodatage et doit avoir une valeur rétroactive arbitraire. Le nombre de lignes n'est pas énorme.

Donc, si j'utilise les migrations, comment puis-je ajouter des données et comment l'obtenir pour ne faire que les deux (ou trois - j'ajoute les plus récentes migrations de données sur la base de données de production lorsqu'elle n'était pas initialement créée via des migrations (je crois ils ont utilisé le schéma à la place)?

Était-ce utile?

La solution

On dirait que vous êtes dans un état où le schéma de base de données de production ne correspond pas exactement à ce que vous utilisez dans dev (bien que ce ne soit pas tout à fait clair). Je voudrais tracer une ligne dans le sable, et obtenir cette prod db dans un meilleur état. Ce que vous voulez faire est essentiellement de vous assurer que la base de données prod a un & "; Schema_info &"; tableau qui répertorie toutes les migrations que vous & avez; pas < jamais envie de fonctionner en production. Ensuite, vous pouvez ajouter des migrations au contenu qui vous tient à cœur et elles iront à l’encontre de la base de production.

Une fois que vous avez terminé, vous pouvez écrire des migrations qui ajoutent des modifications de schéma ou des données, mais vous devez également faire très attention: si vous ajoutez des données à l'aide d'une migration, vous devez définir le modèle dans la migration elle-même. , comme ceci:

class AddSomeColumnsToUserTable < ActiveRecord::Migration
  class User < ActiveRecord::Base; end
  def self.up
    add_column :users, :super_cool, :boolean, :default => :false
    u = User.find_by_login('cameron')
    u.super_cool = true
    u.save
  end

  def self.down
    remove_column :users, :super_cool
  end
end

La raison en est qu’à l'avenir, vous pourriez supprimer complètement le modèle, lors d'une refactorisation ou d'une autre. Si vous ne définissez pas la classe d'utilisateurs sur la ligne & Quot; User.find_by_login ... & Quot; la migration va jeter une exception qui est une grande douleur.

Autres conseils

Je suis toujours cette procédure:

  • Dump de la base de données prod avec la commande mysqldump
  • Remplissez la base de données dev / test avec dump à l'aide de la commande mysql
  • Exécuter les migrations dans dev / test
  • Vérifier que la migration a bien été effectuée
  • Dump de la base de données prod avec la commande mysqldump (car elle peut avoir changé) en conservant la sauvegarde sur le serveur
  • Exécuter des migrations sur prod (à l'aide de capristano)
  • La migration de test a fonctionné sur prod
  • Boire de la bière (en regardant les journaux d'erreur)

Y a-t-il une raison pour laquelle vous n'utilisez pas les mêmes migrations que dans votre environnement de développeur?

L'ajout d'une colonne avec add_column dans une migration doit être non destructif: cela générera un & "; ALTER TABLE &"; déclaration. Si vous savez ce que vous allez mettre dans les colonnes une fois créées, vous pouvez renseigner les valeurs de la migration (vous pouvez choisir une alternative moins fastidieuse si le nombre de lignes est important).

Le fait de supprimer ou de modifier la définition d'une colonne dépend, selon moi, de la plate-forme: certains autoriseront la suppression d'une colonne à la place, d'autres effectueront une séquence de commandes renommer-créer-sélectionner-déposer.

Pour plus de précision, nous avons besoin de plus d'informations: quel type de migration envisagez-vous, sur quelle plate-forme exécutez-vous, devez-vous définir des valeurs dans le cadre de la migration? Des choses comme ça aideraient beaucoup - modifiez simplement la question, ce qui la fera remonter dans la liste.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top