2011-10-24 80 views
25

我用devise和漂亮的生成器创建了一个数据库。我试图让与漂亮的发电机(rails g nifty:scaffold Asset user_id:integer)一个新的数据库,但是当我尝试迁移数据库(rake db:migrate),我收到以下错误:Rake中止...表'用户'已经存在

charlotte-dator:showwwdown holgersindbaek$ rake db:migrate 
== DeviseCreateUsers: migrating ============================================== 
-- create_table(:users) 
rake aborted! 
An error has occurred, all later migrations canceled: 

Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `email` varchar(255) DEFAULT '' NOT NULL, `encrypted_password` varchar(128) DEFAULT '' NOT NULL, `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `sign_in_count` int(11) DEFAULT 0, `current_sign_in_at` datetime, `last_sign_in_at` datetime, `current_sign_in_ip` varchar(255), `last_sign_in_ip` varchar(255), `name` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB 

Tasks: TOP => db:migrate 
(See full trace by running task with --trace) 

我下面的教程,并有很难理解为什么发生这种情况。任何人都可以解释发生了什么?

回答

11

迁移尝试创建一个已经存在于数据库中的表。

尝试从数据库中删除用户表。您的迁移过程出了问题。您还应该将您的schema.rb版本与您的db/migrate/*。rb文件进行比较。

澄清:

似乎很多这样用户就不必我的答复同意,或者是因为他们认为这是不准确或不推荐。

删除表总是具有破坏性,我认为每个人都明白这一点。

我应该提到add_column,因为该表是在另一个迁移文件中创建的。

+39

只要删除表?这是一个可怕的解决方案。 –

+1

我想知道您的解决方案。 –

+12

这显而易见,但我想澄清任何人这样做...... **您在该表中的数据将丢失**。 –

58

在您的create_users迁移(APP_ROOT/db/migrate/..)中,在create_table :users之前加drop_table :users并运行rake db:migrate。它将在重新创建之前删除用户表。运行此迁移后,您可以删除该代码行,以便稍后不会出现错误。如果你没有对数据库的UI访问权限(例如,在heroku上),只需一个小修复。

+0

这两种解决方案都是半工半工的......看起来我真的在做什么错了,所以我退了几步,重新做了。尽管如此,非常感谢伟大的解决方案。 –

+13

这是显而易见的,但我想澄清任何人这样做...... **您在该表中的数据将丢失**。 –

+0

涂料。多谢,伙计。 –

10

如果您知道数据库已正确创建,那么您只需注释移植代码的创建部分即可。例如:

Class ActsAsVotableMigration < ActiveRecord::Migration 
    def self.up 
# create_table :votes do |t| 
# 
#  t.references :votable, :polymorphic => true 
#  t.references :voter, :polymorphic => true 
# 
#  t.boolean :vote_flag 
# 
#  t.timestamps 
# end 
# 
# add_index :votes, [:votable_id, :votable_type] 
# add_index :votes, [:voter_id, :voter_type] 
    end 

    def self.down 
    drop_table :votes 
    end 
end 

如果在创建表,但后来命令未完成出于某种原因,你可以离开后的选项,例如:

Class ActsAsVotableMigration < ActiveRecord::Migration 
    def self.up 
# create_table :votes do |t| 
# 
#  t.references :votable, :polymorphic => true 
#  t.references :voter, :polymorphic => true 
# 
#  t.boolean :vote_flag 
# 
#  t.timestamps 
# end 

    add_index :votes, [:votable_id, :votable_type] 
    add_index :votes, [:voter_id, :voter_type] 
    end 

    def self.down 
    drop_table :votes 
    end 
end 

如果没有您的数据库中的任何重要数据都可以保留,但是您可以只删除表格和所有数据并重新创建它们。例如(通知“drop_table:票”,在self.up):

class ActsAsVotableMigration < ActiveRecord::Migration 
    def self.up 
    drop_table :votes 
    create_table :votes do |t| 

     t.references :votable, :polymorphic => true 
     t.references :voter, :polymorphic => true 

     t.boolean :vote_flag 

     t.timestamps 
    end 

    add_index :votes, [:votable_id, :votable_type] 
    add_index :votes, [:voter_id, :voter_type] 
    end 

    def self.down 
    drop_table :votes 
    end 
end 
1

我觉得这是一个问题,在轨独特的或更常见到MySQL,能够提供具有与mysql2宝石做本身。

我知道这是因为我刚刚从sqlite切换到mysql,并开始有系统地解决这个问题。

就我而言,我只是将已经运行并重新运行迁移的代码(我没有添加更多细节,因为它看起来像我上面的那个人那样)注释掉了。

1

当试图将Devise身份验证添加到现有的Users表时,我遇到了类似的问题。

我的解决方案:我发现我有两个迁移文件,都试图创建用户表。因此,我没有删除表格(可能不是最佳形式),而是创建了第一个(原始)迁移文件,该文件创建了Users表格,然后保留Devise迁移文件。重新运行迁移并且工作正常。

事实证明,Devise文件不会导致问题;我可以看到它正在“改变”表格,而不是“创建它”,这意味着即使没有设计安装,db:migrate可能会导致同样的问题(尽管我没有测试过)。

21

您需要删除该表从SQL精简版控制台(你将失去它包含的所有数据)

  1. 访问SQL精简版控制台,输入端子
    mysql <DB NAME HERE>

  2. 删除表(不要忘记最后的;(分号))
    drop table table_name;

  3. 运行分贝:迁移再次
    bin/rake db:migrate

希望它能帮助,它为我工作

+0

问题是关于MySQL,而不是Sqlite。 –

+0

真正为mysql编辑 –

11

如果你想打稳扎,不希望丢失任何数据,那么你可以检查该表存在于您的数据库中。

class DeviseCreateUsers < ActiveRecord::Migration 
    def up 
    if table_exists?(:users) 
     # update or modify columns of users table here accordingly. 
    else 
     # create table and dump the schema here 
    end 
    end 

    def down 
    # same approach goes here but in the reverse logic 
    end 
end 
0

如果你想让您的数据重命名表,但这样做的迁移,以节省时间,然后将其删除,一旦迁移已经跑了。

的顶部部分放在部分的迁移文件中。

rename_table :users, :users2 
4

请勿删除表格。数据>迁移!

数据库的版本已经反映了导致错误的迁移尝试添加的更改。换句话说,如果迁移可以被跳过,那么一切都会好的。检查db_schema_migrations表并尝试插入错误迁移的版本(e.x,20151004034808)。在我的情况下,这导致后续的迁移完美执行,一切似乎都很好。

还不确定是什么导致了这个问题。