2017-05-09 60 views
0

我在我的Rails应用程序中创建了一个名为Categorie的模型。 由于出错,我需要删除模型。Rails:耙由于已经存在的表而中止,但无法删除它

我跑

rails d model Categorie 

可以除去我现有的模型。

我忘了在那一刻运行rails g migration DropTable

但后来,我需要重新创建Categorie模型,所以我跑:

rails g model Categorie name:string 

可是当我要运行rake db:migrate我得到以下错误:

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

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

之后,我试图删除表重做所有的过程,但它不工作,表仍然在schema.rb

我知道不建议手动从这就是为什么我想知道是否有人会知道这件事的文件。我知道这是一个白痴的错误,但现在我不知道如何解决这个问题。

下面是我试图删除该表:

rails g migration DropCategories 

def change 
    drop_table :categories 
end 

rake db:migrate 

我认为这是与删除表,因为这里是输出端的问题,当我迁移数据库:

== 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似乎创建一个表,而不是删除我想要的。

+0

你是怎样尝试删除该表?错误消息正在发生,因为该表仍在MySQL数据库中,而不是因为它在'schema.rb'中。如果您使用MySQL客户端删除表,那么无论“schema.rb”中的内容如何,​​您的迁移都应该成功。 – Brian

+0

@Brian我做了rails g迁移DropCategories,然后我用drop_table修改了迁移文件:类别 – justinedps26

+0

您可以尝试回滚(rake db:rollback),然后更改迁移文件,以便只有一个文件创建表。 N.B:回滚将模式回滚到以前的版本。 –

回答

0

你可以简单地删除该表,如果它在你的新的迁移存在:

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 

reversible位确保正常运行迁移时自定义表删除代码只执行,只要你做的就是忽略一个rollback

+0

我已经完成了一些更容易的事情。我为Mac使用了一个名为SequelPro的MySql客户端。我已经删除了它的表,并知道一切正常完美!无论如何感谢您的贡献! – justinedps26

+0

您的问题与如何解决此问题有关,而无需手动执行。你刚刚完成与你正在寻找的东西完全相反的东西。我的答案仍然存在,并会为你工作。 – Jon

+0

我没有这样说过。我只是想要一种解决我的问题的方法,即以任何方式从我的数据库中删除表格!但是,谢谢你的回答,我确信这将有助于别人,甚至有一天! – justinedps26

0

按照以下步骤来解决该问题

  1. 在迁移文件注释中的 '变' 法

    def change 
        create_table :categories do |t| 
        #t.string :name 
        #t.timestamps 
        end 
    end 
    
  2. 运行耙分贝代码:迁移命令

  3. 取消注释'change'方法中的代码

    def ch ange create_table:categories do | t | t.string:名称 t。时间戳 结束

  4. 现在运行耙分贝:迁移

  5. 现在你的迁移得到恢复正常,你可以继续你需要什么

相关问题