2008-10-10 7 views
1

Je développe actuellement une application Rails en utilisant une base de données qui a été conçue avant que je ne connaisse l'existence de Rails.
J'ai actuellement créé des migrations pour ajouter de nouvelles tables et de nouvelles colonnes aux tables existantes.Comment créer les migrations pour une base de données existante?

Je voudrais avoir les migrations pour recréer la base de données complète.

Quelles étapes dois-je suivre?
Dois-je créer toutes les migrations à la main?

EDIT: Je suis intéressé par le schéma de base de données non dans le contenu de base de données

Répondre

3

Je pense que cela nécessitera un travail manuel.

Vous pouvez commencer en exécutant rake db:schema:dump si vous ne disposez pas du fichier db/schema.rb dans votre projet. Vous avez probablement déjà un fichier db/schema.rb si vous avez utilisé des migrations. Ce fichier contiendra la représentation ruby ​​de la base de données que vous avez configurée pour le développement. Pour obtenir la représentation ruby ​​d'une autre base de données passer dans RAILS_ENV à la commande rake (par exemple RAILS_ENV=production rake db:schema:dump)

Vous pouvez ensuite utiliser ce fichier schema.rb comme point de départ pour créer de nouvelles migrations qui recréent les tables préexistantes. Lors de la création du nouveau fichier de migration, assurez-vous qu'il est nommé de telle sorte qu'il soit exécuté avant vos autres migrations.

+0

Salut, j'ai le même problème, que voulez-vous dire par l'utilisation de schema.rb comme point de départ après 'rake db: schéma: dump' – hershey92

+0

Prenez le vidage et créer une migration (unique) hors de lui (en gros envelopper l'ensemble chose dans une déclaration de migration des rails). –

1

Réponse courte: Oui

Réponse longue: Cela dépend de la façon dont la base de données a été installé et dans quelle mesure il diffère de votre actuel . Aussi, parce que je suppose que les ID sont générés dynamiquement - si vous passez d'une table à l'autre assurez-vous que toutes vos clés étrangères sont mises à jour correctement.

Écrivez un script qui recrée l'intégralité du DB à partir des anciennes données. Si vous avez posté votre schéma de base de données et votre nouveau schéma de base de données, je serais heureux de vous aider :) :)

+0

Les schémas de base de données seront identiques. J'ai écrit les migrations pour seulement quelques nouvelles tables. Dois-je écrire les migrations pour chacune des anciennes tables? – hectorsq

7

Nous avons eu ce problème lorsque nous avons porté une application PHP sur des rails. Ce que nous avons fait est similaire à la suggestion de tomtoday. Nous avons d'abord pointé la configuration des rails vers la base de données actuelle. Ensuite, nous avons fait un rake db: schema: dump et copié le fichier db/schema.rb vers quelque chose comme db/schema_base.rb. Ensuite, vous effectuez votre première migration en chargeant ce schéma. Par exemple:

class CreateTables < ActiveRecord::Migration 
    def self.up 
    `cp #{Rails.root}/db/schema_base.rb #{Rails.root}/db/schema.rb` 
    Rake::Task['db:schema:load'].invoke 
    end 

    def self.down 
    end 
end 

Forcez simplement cette migration et vous serez sur votre chemin. Ensuite, vous commencez à écrire des migrations pour transformer la base de données afin qu'elle soit plus conforme à la méthode Rails. Nous avons écrit des migrations pour renommer correctement les colonnes d'id, les relations de clés étrangères, les noms de tables, etc.
Rappelez-vous que la sauvegarde de schéma ne prend pas en charge les contraintes et les déclencheurs de clé étrangère si vous les utilisez.

+0

fonctionne! mais vous devez modifier RAILS_ROOT à Rails.root dans Rails 3.2 – sebast26

Questions connexes