2017-06-27 6 views
1

Une application Rails fonctionnait depuis un an. Maintenant, je veux refondre sa base de données afin qu'elle puisse exécuter les nouvelles fonctionnalités de mon application que je vais envoyer bientôt à Heroku. Plutôt que de créer des migrations qui ajoutent, suppriment et modifient des colonnes et des noms de tables, je souhaite créer une nouvelle base de données et y transférer les anciennes données.Rails: Réorganisation d'une base de données heroku postgres en direct

Comme je ne sais pas les bases de données trop, mon idée est:

  1. Téléchargez les tableaux importants comme csv de l'ancienne base de données
  2. Créer un nouveau schéma de base de données dans la nouvelle application
  3. Marque le csv correspond au nouveau schéma
  4. Supprimer la base de données ancienne en direct
  5. Poussez la nouvelle application pour Heroku
  6. semences les tables dans la nouvelle d atabase
  7. espoir tout fonctionne

Est-ce une bonne idée? Je vois qu'il est possible de "joindre" une base de données de l'application 1 à l'application 2. Dois-je créer la nouvelle base de données dans une autre application et y graver les données, puis l'attacher et la promouvoir à l'application originale afin que le base de données originale sera conservée et peut être ré-attachée si quelque chose de mal se passe?

Répondre

0

Tout d'abord, si votre application est en direct, mettez l'application sur maintenance mode.

Il n'y aura donc pas de nouvelle mise à jour de la base de données.

Maintenant, prenez la sauvegarde db de votre application d'origine et enregistrez quelque part sur votre machine locale. Chaque fois que vous avez besoin de données, vous avez des données appropriées avec vous. À mon avis, vous devriez créer une nouvelle instance de heroku et télécharger l'original leur meilleure option. Parce que vous pouvez tester toutes les fonctionnalités là-bas.

Vous pouvez également faire la même chose sur votre environnement local, mais parfois les modifications locales ne fonctionnent pas correctement en mode direct.

Maintenant, faites de nouveaux changements de base de données dans la nouvelle instance d'heroku, testez votre application.

Si vous êtes satisfait des modifications que vous avez apportées, copiez le fichier db nouvellement créé dans l'application d'origine.

Désactivez le mode maintenance et vous avez terminé.

0

Comme il semble que vous ne avez pas besoin d'automatiser je voudrais:

  • créer une sauvegarde de la DB de production juste au cas où
  • préparer la base de données locale, avec toutes les données définitives (vous pouvez utiliser quelle que soit la méthode d'obtenir les enregistrements corrects en ce compris votre chemin csv - il y a beaucoup de façons, je tends généralement préférer construire des modèles de JSON et ensuite utiliser que pour les semences)
  • mise à jour/créer la nouvelle application
  • copie local db en production en utilisant la CLI d'heroku Heroku's PG-Push/Pull

Votre nouveau schéma d'application devra se conformer bien sûr, ce qui est l'une des raisons pour lesquelles PG-Push est bonne, parce que si vous travaillez sur une nouvelle application ou qui errait beaucoup trop de la production "branche" en termes de migrations et autres, vous pouvez simplement pousser votre branche locale à déployer et ensuite pousser la base de données sous-jacente en local à la production, en les gardant synchronisés. Néanmoins, vous aurez besoin de la version "locale" du Db bien rangé et prêt.

Addendum aux semences enregistrements de partiellement les enregistrements existants que je ferais quelque chose comme (garder à l'esprit que vous devriez faire comme les méthodes de quelque chose, quelque part, que vous pouvez ensuite exécuter dans la console):

new_hash_of_objects = { } 
Model_you_want.all.each do |model| 
    new_hash_of_objects[model.id.to_sym] = { 
    new_attribute_1 = '...', 
    new_attribute_2 = '...', 
    old_attribute_1 = model.old_attribute_1, 
    ... 
    } 
end 

File.open("somewhere/json_records/records.json","w") do |f| 
    f.write("#{new_hash_of_objects.to_json}") 
end 

Ensuite, vous pouvez avoir quelque chose à les charger en arrière:

def read_json_copy_of_months 
    @json = JSON.parse(File.read("somewhere/json_records/records.json")).as_json.with_indifferent_access 
    @json.each do |m,record| 
     Record.create!(record) 
     end 
    end 
    end 

Si vous avez des millions de lignes cela pourrait obtenir lourd, donc vous devez diviser en plus petits fichiers.