2017-05-09 1 views
0

J'ai créé un modèle nommé Categorie dans mon application Rails. En raison d'une erreur, j'ai dû retirer le modèle.Rails: rake abandonné en raison d'une table déjà existante mais impossible de l'enlever

Je couru

rails d model Categorie 

qui a supprimé mon modèle existant.

J'ai oublié d'exécuter rails g migration DropTable à ce moment-là.

Mais alors, je devais recréer le modèle Catégorie donc je couru:

rails g model Categorie name:string 

Mais quand je veux courir rake db:migrate je reçois l'erreur suivante:

rake aborted! 
StandardError: An error has occurred, all later migrations canceled: 

Mysql2::Error: Table 'categories' already exists: CREATE TABLE `categories` ... 

Après cela, J'ai essayé de laisser tomber la table pour refaire tout le processus mais cela ne fonctionne pas, la table est toujours dans schema.rb

Je sais qu'il n'est pas recommandé de le faire manuellement à partir de le fichier c'est pourquoi je voudrais savoir si quelqu'un sait quelque chose à ce sujet. Je sais que c'est une erreur idiote mais maintenant je ne sais pas comment résoudre ce problème.

Voici comment j'ai essayé de laisser tomber la table:

rails g migration DropCategories 

def change 
    drop_table :categories 
end 

rake db:migrate 

Je pense qu'il ya un problème avec la suppression de la table, car voici la sortie quand j'émigre la base de données:

== 20170509123739 CreateCategories: migrating ================================= 
-- create_table(:categories) 
rake aborted! 
StandardError: An error has occurred, all later migrations canceled: 

Mysql2::Error: Table 'categories' already exists: CREATE TABLE `categories` (`id` int(11) auto_increment PRIMARY KEY, `name` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) ENGINE=InnoDB 

Rails semble créer une table et ne pas supprimer celui que je veux.

+0

Comment avez-vous essayé de laisser tomber la table? Le message d'erreur arrive parce que la table est toujours dans votre base de données MySQL, pas parce qu'elle est dans 'schema.rb'. Si vous utilisez un client MySQL pour supprimer la table, votre migration devrait réussir, quoi qu'il en soit dans 'schema.rb'. – Brian

+0

@Brian j'ai fait des rails de migration DropCategories et puis j'ai modifié le fichier de migration avec drop_table: catégories – justinedps26

+0

Vous pouvez essayer de restaurer (rake db: rollback), puis modifier vos fichiers de migration de sorte que vous avez seulement un fichier qui crée la table . N.B: une restauration ramène le schéma à la version précédente. –

Répondre

0

Vous pouvez simplement laisser tomber la table si elle existe dans votre nouvelle migration:

def change 
    reversible do |dir| 
    dir.up do 
     drop_table :categories if table_exists? :categories # pre rails 5 
     drop_table :categories, if_exists: true # rails 5 and onwards 
    end 
    end 

    # put the rest of your migration here: 
    create_table :categories do |t| 
    t.string :name 

    t.timestamps 
    end 
end 

Le bit reversible assure que le code de suppression de table personnalisée est exécutée uniquement lors de l'exécution de la migration normalement, et est ignoré chaque fois que vous faites un rollback.

+0

J'ai juste fait quelque chose de plus facile. J'ai utilisé un client MySql pour Mac appelé SequelPro. J'ai supprimé la table avec et je sais que tout fonctionne parfaitement! Merci de contribuer quand même! – justinedps26

+0

Votre question concernait spécifiquement comment résoudre ceci sans le faire manuellement. Vous venez de faire exactement le contraire de ce que vous cherchiez. Ma réponse est toujours là et aurait fonctionné pour vous. – Jon

+0

Je n'ai rien dit de tel. Je viens de demander un moyen de résoudre mon problème qui supprimait une table de ma base de données de quelque façon que ce soit! Mais merci pour votre réponse encore une fois je suis sûr que cela sera utile pour quelqu'un d'autre ou même moi un jour! – justinedps26

0

Suivez ces étapes pour résoudre le problème

  1. dans votre commentaire de fichier de migration le code dans la méthode 'changement'

    def change 
        create_table :categories do |t| 
        #t.string :name 
        #t.timestamps 
        end 
    end 
    
  2. run rake db: commande migrer

  3. uncomment le code dans la méthode 'change'

    def ch ange create_table: catégories do | t | t.string: nom t.horodatages fin

  4. Maintenant, exécutez rake db: migrate

  5. Maintenant vos migrations obtenir retour à la normale et vous pouvez continuer ce que vous avez besoin