2011-10-24 10 views
25

私はdeviseとnifty generatorでデータベースを作成しました。私は、気の利いた発電機(rails g nifty:scaffold Asset user_id:integer)で新しいデータベースを作成しようとしているが、私はデータベース(rake db:migrate)を移行しようとすると、私は次のエラーを取得:レイクは中止されました...テーブル 'users'はすでに存在します

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は、別のマイグレーションファイルでテーブルが作成されているので、これを説明しておきます。あなたのcreate_users移行で

+39

テーブルを削除するだけですか?それは恐ろしい解決策です。 –

+1

私はあなたの解決策を知りたいです。 –

+12

これは明らかですが、私はこれを行う人を明確にしたいと思います。**あなたのデータは失われます**。 –

58

(APP_ROOT/DB /移行/ ..)、右create_table :usersdrop_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 

あなたが持っていない場合データベース内の重要なデータを保存するだけで、テーブルとすべてのデータを削除して新しく作成することができます。例えば、(予告:するself.upで「DROP_TABLE票」、):

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

は、私は、これはmysql2宝石をどうすることも可能、レール内のMySQLに固有以上の共通の問題だと思います自体。

私はsqliteからmysqlに切り替えただけで、この問題が系統的に発生し始めたので、これはわかります。

私の場合、すでに実行していたコードをコメントアウトして、もう一度マイグレーションを実行しました(私の上の人のように見えるため、詳細を追加していません)。

1

既存のUsersテーブルにDevise認証を追加しようとすると、同様の問題が発生しました。

私の解決策:2つの移行ファイルがあり、どちらもUsersテーブルを作成しようとしていました。だから、テーブルを削除するのではなく(おそらく最高の習慣ではありません)、私はUsersテーブルを作成した最初の(元の)マイグレーションファイルをコメントアウトし、そのままDeviseマイグレーションファイルをそのまま残しました。移行を再実行しても正常に動作しました。

明らかに、Deviseファイルは問題の原因ではありませんでした。テーブルを「変更」するのではなく、テーブルを「変更」していることがわかります。これは、データベースがインストールされていない場合でも、db:migrateが同じ問題を引き起こしている可能性があることを意味します。

21

あなたは(あなたがそれに含まれるすべてのデータが失われます)は、SQL Liteのコンソールから、端末
mysql <DB NAME HERE>

    1. アクセスするSQL Liteのコンソール、タイプをそのテーブルを削除する必要がありますドロップテーブル(最後にを忘れないでください。(セミコロン))
      drop table table_name;

    2. 実行デシベル:移行再び
      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

    あなたがにしたい場合は、移行が走っていたら、それを削除し、テーブルの名前を変更あなたのデータを保持しますが、時間を節約するために、移行でそれを行います。

    移行ファイルのupセクションの上部に配置します。

    rename_table :users, :users2 
    
    4

    テーブルを削除しないでください。データ>移行!

    データベースのバージョンには、エラーが発生した移行で追加しようとしている変更が反映されています。言い換えれば、移行がスキップされる可能性がある場合は、すべてが問題ありません。 db_schema_migrationsテーブルを確認し、誤った移行のバージョン(e.x、20151004034808)を挿入してみてください。私の場合、これはその後の移行が完全に実行され、すべてがうまくいくように見えます。

    この問題の原因はまだわかりません。

    関連する問題