2011-10-24 15 views
25

He creado una base de datos con el ingenio y el ingenioso generador. Estoy tratando de hacer una nueva base de datos con el generador ingenioso (rails g nifty:scaffold Asset user_id:integer), pero cuando trato de migrar la base de datos (rake db:migrate), me sale el siguiente error:Rake abortado ... la tabla 'users' ya existe

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) 

estoy siguiendo un tutorial y tienen Es bastante difícil entender por qué sucede esto. ¿Puede alguien explicar qué está pasando?

Respuesta

11

La migración está intentando crear una tabla que ya existe en su base de datos.

Intente eliminar la tabla de usuario de su base de datos. Algo salió mal con su proceso de migración. También debe comparar su versión schema.rb con sus archivos db/migrate/*. Rb.

Aclaración:

Parece que muchos que los usuarios no están de acuerdo con mi respuesta, ya sea porque consideran que es inexacta o no se recomienda.

Eliminar una tabla siempre es destructivo, y creo que todos entienden eso.

Debería haber mencionado add_column, ya que la tabla se estaba creando en otro archivo de migración.

+39

¿Borrar la tabla? Esa es una solución horrible. –

+1

Me gustaría saber su solución. –

+12

Esto es obvio, pero quiero aclararle a cualquiera que haga esto ... ** Sus datos en esa tabla se perderán **. –

58

En su migración create_users (apl_raíz/db/migrate/..), añadir drop_table :users justo antes create_table :users y ejecutar rake db:migrate. Eliminará la tabla de usuarios antes de volver a crearla. Puede eliminar esa línea de código después de ejecutar esta migración para que no le proporcione errores más adelante. Solo una pequeña solución si no tienes acceso a UI a una base de datos (en heroku, por ejemplo).

+0

Ambas soluciones semi-trabajadas ... Parecía que realmente había hecho algo mal en el toturial, así que retrocedí un par de pasos y volví a hacerlo. Muchas gracias por las excelentes soluciones. –

+13

Esto es obvio, pero quiero aclararle a cualquiera que haga esto ... ** Sus datos en esa tabla se perderán **. –

+0

Dope. gracias amigo –

10

Si sabe que la base de datos se creó correctamente, puede comentar la parte de creación del código de migración. Por ejemplo:

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 

Si se creó la tabla, pero los comandos posteriores no fueron completados por alguna razón, sólo puede salir de las opciones posteriores, por ejemplo:

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 

Si usted no tiene cualquier dato importante en su base de datos para preservar, sin embargo, puede simplemente dejar caer la tabla y todos los datos y crearlos frescos. Por ejemplo (aviso de los "drop_table: votos", en el 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

creo que esto es un problema único o más común de MySQL en los carriles, es posible que tenga que ver con la gema mysql2 sí mismo.

Lo sé porque acabo de cambiar de sqlite a mysql y acabo de empezar a tener este problema sistemáticamente.

En mi caso, simplemente comenté el código que ya se había ejecutado y ejecuté la migración nuevamente (que no voy a agregar más detalles porque parece que el tipo que está arriba de mí hizo eso).

1

Tuve un problema similar al intentar agregar la autenticación Devise a una tabla de Usuarios existente.

Mi solución: Encontré que tenía dos archivos de migración, ambos tratando de crear la tabla de Usuarios. Entonces, en lugar de eliminar la tabla (probablemente no sea el mejor hábito para formar), comenté el primer archivo de migración (original) que creó la tabla de Usuarios y luego abandoné el archivo de migración de Decisiones tal como está. Volvió a ejecutar la migración y funcionó bien.

Como resultado, el archivo Devise no estaba causando el problema; Puedo ver que está "cambiando" la tabla, no "creando", lo que significa que incluso sin la instalación del diseño, un db: migrate probablemente habría causado el mismo problema (aunque no he probado esto).

21

necesitas dejar que la mesa de la consola SQL Lite (Va perdido todos los datos contenidos en ella)

  1. un acceso a la consola de Lite sql, el tipo de terminal de
    mysql <DB NAME HERE>

  2. tabla de la gota (no se olvide la última ; (punto y coma))
    drop table table_name;

  3. plazo db: migrate nuevo
    bin/rake db:migrate

creo que sirve, que trabajó para mí

+0

La pregunta es sobre MySQL, no Sqlite. –

+0

true edited for mysql –

11

Si quieres jugar seguro y no quieren perder los datos a continuación, se puede comprobar si la tabla existe en su base de datos.

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

Si desea mantener sus datos , cambiar el nombre de la tabla, pero lo hacen en la migración a ahorrar tiempo, luego lo elimina una vez que la migración tiene funcionó.

Coloque en la parte superior de la sección hasta del archivo de migración.

rename_table :users, :users2 
4

No eliminar tablas. Datos > migraciones!

La versión de la base de datos ya refleja los cambios que la migración causante de error está intentando agregar. En otras palabras, si se puede saltear la migración, todo estaría bien. Verifique la tabla db_schema_migrations e intente insertar la versión de la migración errónea (e.x, 20151004034808). En mi caso, esto provocó que las migraciones posteriores se ejecutaran perfectamente y todo parece estar bien.

Aún no estoy seguro de qué causó este problema.

Cuestiones relacionadas