it-swarm.com.de

Rake abgebrochen ... Tabelle 'Benutzer' existiert bereits

Ich habe eine Datenbank mit Gerät und dem intelligenten Generator erstellt. Ich versuche, eine neue Datenbank mit dem schnellen Generator (Rails g nifty:scaffold Asset user_id:integer) zu erstellen, aber wenn ich versuche, die Datenbank (rake db:migrate) zu migrieren, erhalte ich folgende Fehlermeldung:

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)

Ich folge einem Tutorial und finde es sehr schwer zu verstehen, warum das so ist. Kann jemand erklären, was los ist?

Die Migration versucht, eine Tabelle zu erstellen, die bereits in Ihrer Datenbank vorhanden ist.

Versuchen Sie, die Benutzertabelle aus Ihrer Datenbank zu entfernen. Bei Ihrem Migrationsprozess ist ein Fehler aufgetreten. Sie sollten auch Ihre schema.rb-Version mit Ihren db/migrate/*. Rb-Dateien vergleichen.

Klarstellung:

Es scheint, dass viele SO - Benutzer meiner Antwort nicht zustimmen, entweder weil sie dies für ungenau halten oder nicht empfohlen werden.

Das Entfernen eines Tisches ist immer destruktiv, und ich denke, dass jeder das versteht.

Ich hätte add_column erwähnen sollen, da die Tabelle in einer anderen Migrationsdatei erstellt wurde.

12
Paulo Abreu

Fügen Sie in Ihrer create_users-Migration (APP_ROOT/db/migrate/..) drop_table :users direkt vor create_table :users hinzu und führen Sie rake db:migrate aus. Es entfernt die Benutzertabelle, bevor sie neu erstellt wird. Sie können diese Codezeile nach der Ausführung der Migration entfernen, sodass Sie später keine Fehler mehr erhalten. Nur ein kleiner Fix, wenn Sie keinen Zugriff auf die Benutzeroberfläche einer Datenbank haben (z. B. auf Heroku).

63
Artem Kalinchuk

Sie müssen diese Tabelle aus der SQL-Konsole löschen (Sie verlieren alle darin enthaltenen Daten).

  1. Greifen Sie auf die SQL Lite-Konsole zu, und geben Sie terminal ein
    mysql <DB NAME HERE>

  2. Drop-Tabelle (vergessen Sie nicht das letzte; (Semikolon))
    drop table table_name;

  3. führen Sie db: migrate erneut aus
    bin/rake db:migrate

Ich hoffe es hilft, es hat bei mir funktioniert

22
Gonza Piotti

Wenn Sie auf Nummer sicher gehen möchten und keine Daten verlieren möchten, können Sie überprüfen, ob die Tabelle in Ihrer Datenbank vorhanden ist.

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
13
Surya

Wenn Sie wissen, dass die Datenbank ordnungsgemäß erstellt wurde, können Sie den Erstellungsteil des Migrationscodes einfach auskommentieren. Zum Beispiel:

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

Wenn die Tabelle erstellt wurde, spätere Befehle jedoch aus irgendeinem Grund nicht ausgeführt wurden, können Sie die späteren Optionen einfach lassen, beispielsweise:

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

Wenn Sie keine signifikanten Daten in Ihrer Datenbank haben, können Sie die Tabelle und alle Daten einfach löschen und neu erstellen. Zum Beispiel ( beachte die "drop_table: votes" im 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
10
Andrew Case

Tabellen nicht löschen Daten> Migrationen!

Die Version der Datenbank spiegelt bereits die Änderungen wider, die die fehlerverursachende Migration hinzuzufügen versucht. Mit anderen Worten, wenn die Migration übersprungen werden könnte, wäre alles in Ordnung. Überprüfen Sie die Tabelle db_schema_migrations, und fügen Sie die Version der fehlerhaften Migration ein (e.x, 20151004034808). In meinem Fall führte dies dazu, dass nachfolgende Migrationen perfekt ausgeführt wurden und alles scheint in Ordnung zu sein.

Immer noch nicht sicher, was dieses Problem verursacht hat.

5
Michael Fulton

Ich hatte ein ähnliches Problem, als ich versuchte, die Devise-Authentifizierung einer vorhandenen Users-Tabelle hinzuzufügen. 

Meine Lösung: Ich habe festgestellt, dass ich zwei Migrationsdateien hatte, die beide die Users-Tabelle erstellen wollten. Anstatt die Tabelle zu löschen (wahrscheinlich nicht die beste Angewohnheit zu bilden), habe ich die erste (ursprüngliche) Migrationsdatei, die die Users-Tabelle erstellt hat, auskommentiert und dann die Devise-Migrationsdatei unverändert gelassen. Führen Sie die Migration erneut aus und es hat gut funktioniert.

Es stellte sich heraus, dass die Devise-Datei das Problem nicht verursacht hat. Ich kann sehen, dass es die Tabelle "ändert", nicht "sie erstellt", was bedeutet, dass eine db: migrate auch ohne die Installation von devise wahrscheinlich dasselbe Problem verursacht hätte (obwohl ich dies nicht getestet habe).

1
Kevin Hough

Wenn Sie Ihre Daten beibehalten möchten , die Tabelle umbenennen möchten , dies jedoch in der Migration tun, um Zeit zu sparen, entfernen Sie sie nach Ablauf der Migration.

Platzieren Sie im oberen Teil des Abschnitts up der Migrationsdatei.

rename_table :users, :users2
1
Alex V

Ich denke, das ist ein Thema, das für mysql in Rails einmalig ist oder häufiger ist, was möglicherweise mit dem mysql2 gem selbst zusammenhängt.

Ich weiß das, weil ich gerade von sqlite zu mysql gewechselt bin und dieses Problem systematisch angefangen habe. 

In meinem Fall habe ich den Code, der bereits ausgeführt wurde, einfach auskommentiert und die Migration erneut ausgeführt (was ich nicht näher erläutere, da es so aussieht, als ob der Typ über mir das getan hätte). 

1
boulder_ruby

Wenn Ihre App neu ist und Sie sich nicht für die Daten in Ihrer Datenbank interessieren, gehen Sie einfach wie folgt vor:

rake db:reset
0
user5783745