J'ai créé une base de données avec le générateur et le génial Nifty. J'essaie de créer une nouvelle base de données avec le générateur nifty (Rails g nifty:scaffold Asset user_id:integer
), mais lorsque j'essaie de migrer la base de données (rake db:migrate
), l'erreur suivante apparaît:
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)
Je suis un tutoriel et j'ai du mal à comprendre pourquoi cela se produit. Quelqu'un peut-il expliquer ce qui se passe?
La migration tente de créer une table qui existe déjà dans votre base de données.
Essayez de supprimer la table utilisateur de votre base de données. Quelque chose ne va pas avec votre processus de migration. Vous devez également comparer votre version de schema.rb avec vos fichiers db/migrate/*. Rb.
Clarification:
Il semble que beaucoup d'utilisateurs SO ne sont pas d'accord avec ma réponse, soit parce qu'ils la considèrent inexacte ou non recommandée.
Supprimer une table est toujours destructeur et je pense que tout le monde comprend cela.
J'aurais dû mentionner add_column , puisque la table était créée dans un autre fichier de migration.
Dans votre migration create_users
(APP_ROOT/db/migrate/..), ajoutez drop_table :users
juste avant create_table :users
et exécutez rake db:migrate
. Il supprimera la table des utilisateurs avant de la recréer. Vous pouvez supprimer cette ligne de code après avoir exécuté cette migration afin d'éviter toute erreur ultérieure. Juste un petit correctif si vous n'avez pas accès à une interface utilisateur à une base de données (sur heroku, par exemple).
Vous devez supprimer cette table de la console sql lite (vous perdrez toutes les données qu'elle contient)
Accéder à la console sql lite, taper le terminalmysql <DB NAME HERE>
Drop table (n'oubliez pas le dernier; (point-virgule))drop table table_name;
lancer db: migrate againbin/rake db:migrate
J'espère que ça aide, ça a fonctionné pour moi
Si vous voulez jouer en sécurité et ne pas perdre de données, vous pouvez vérifier si la table existe dans votre base de données.
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
Si vous savez que la base de données a été créée correctement, vous pouvez simplement commenter la partie création du code de migration. Par exemple:
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 la table a été créée, mais que les commandes ultérieures n'ont pas été exécutées pour une raison quelconque, vous pouvez simplement laisser les options ultérieures, par exemple:
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 vous ne souhaitez pas conserver de données importantes dans votre base de données, vous pouvez simplement lui demander de supprimer la table et toutes les données et de la créer à nouveau. Par exemple ( notez le "drop_table: votes", dans le 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
Ne supprimez pas les tables. Données> migrations!
La version de la base de données reflète déjà les modifications que la migration à l'origine de l'erreur tente d'ajouter. En d'autres termes, si la migration pouvait être ignorée, tout irait bien. Vérifiez la table db_schema_migrations et essayez d'insérer la version de la migration erronée (e.x, 20151004034808). Dans mon cas, cela a entraîné une parfaite exécution des migrations ultérieures et tout semble aller pour le mieux.
Toujours pas sûr de ce qui a causé ce problème.
J'ai eu un problème similaire en essayant d'ajouter l'authentification Devise à une table Utilisateurs existante.
Ma solution: j'ai constaté que j'avais deux fichiers de migration, tous deux essayant de créer le tableau Utilisateurs. Ainsi, plutôt que de supprimer la table (probablement pas la meilleure habitude à former), j'ai commenté le premier fichier de migration (original) qui a créé la table Utilisateurs, puis laissé le fichier Devise migrate tel quel. Réexécutez la migration et cela a bien fonctionné.
En fin de compte, le fichier Devise n'était pas à l'origine du problème. Je peux voir qu'il s'agit de "changer" la table, pas de "la créer", ce qui signifie que même sans l'installation de la base de données, un db: migrate aurait probablement causé le même problème (bien que je ne l'aie pas testé).
Si vous voulez conserver vos données, renommer la table, faites-le dans la migration pour gagner du temps, puis supprimez-la une fois la migration effectuée.
Placez-le dans la partie supérieure de la section up du fichier de migration.
rename_table :users, :users2
Je pense que c'est un problème unique ou plus commun à mysql dans Rails, qui peut avoir à voir avec le gem mysql2 lui-même.
Je le sais parce que je viens de passer de sqlite à mysql et que je commence tout juste à avoir ce problème systématiquement.
Dans mon cas, j'ai simplement commenté le code qui avait déjà été exécuté et exécuté la migration à nouveau (auquel je n'ajoute pas plus de détails, car il semble que le gars au-dessus de moi l'ait fait).