Rake aborted... table 'users' уже существует
Я создал базу данных с разработкой и отличным генератором. Я пытаюсь создать новую базу данных с отличным генератором (rails g nifty:scaffold Asset user_id:integer
), но когда я пытаюсь выполнить миграцию базы данных (rake db:migrate
), я получаю следующую ошибку:
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)
Я следую учебнику и довольно трудно понять, почему это происходит. Кто-нибудь может объяснить, что происходит?
Ответы
Ответ 1
Миграция пытается создать таблицу, которая уже существует в вашей базе данных.
Попробуйте удалить пользовательскую таблицу из вашей базы данных. Что-то пошло не так с вами в процессе миграции. Вам также следует сравнить вашу версию schema.rb с вашими файлами db/migrate/*. Rb.
Разъяснение:
Кажется, что многие пользователи SO не согласны с моим ответом, либо потому, что считают его неточным, либо не рекомендуется.
Удаление стола всегда разрушительно, и я думаю, что все это понимают.
Я должен был упомянуть add_column, так как таблица создавалась в другом файле миграции.
Ответ 2
В вашей миграции create_users
(APP_ROOT/db/migrate/..) добавьте drop_table :users
прямо перед create_table :users
и запустите rake db:migrate
. Он удалит таблицу пользователей перед ее воссозданием. Вы можете удалить эту строку кода после выполнения этой миграции, чтобы впоследствии не давать вам ошибок. Просто небольшое исправление, если у вас нет доступа к базе данных (например, на герою).
Ответ 3
Вам нужно отбросить эту таблицу из консоли sql lite (вы потеряете все данные, содержащиеся в ней)
-
Откройте консоль sql lite, введите терминал
mysql <DB NAME HERE>
-
Отключить таблицу (не забывайте последнюю ; (точка с запятой))
drop table table_name;
-
запустите db: выполните миграцию снова
bin/rake db:migrate
Надеюсь, это поможет, это сработало для меня.
Ответ 4
Если вы хотите играть безопасно и не хотите потерять какие-либо данные, вы можете проверить, существует ли таблица в вашей базе данных.
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
Ответ 5
Если вы знаете, что база данных была создана правильно, вы можете просто прокомментировать часть создания кода миграции. Например:
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: votes", в 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
Ответ 6
Не удалять таблицы. Данные > Миграция!
Версия базы данных уже отражает изменения, которые пытается добавить ошибка, вызываемая миграцией. Другими словами, если миграция может быть пропущена, все будет хорошо. Проверьте таблицу db_schema_migrations и попробуйте вставить версию ошибочной миграции (e.x, 20151004034808). В моем случае это привело к тому, что последующие миграции выполнялись отлично, и все кажется прекрасным.
Все еще не уверен, что вызвало эту проблему.
Ответ 7
Я думаю, что это проблема, уникальная или более общая для mysql в rails, возможно, связанная с самим камнем mysql2.
Я знаю это, потому что я просто переключился с sqlite на mysql и только начал эту проблему систематически.
В моем случае я просто прокомментировал код, который уже запущен, и снова выполнил миграцию (что я не добавляю больше деталей, потому что похоже, что парень над мной сделал это).
Ответ 8
У меня была аналогичная проблема при попытке добавить аутентификацию Devise в существующую таблицу Users.
Мое решение: я обнаружил, что у меня было два файла миграции, оба пытались создать таблицу Users. Поэтому вместо того, чтобы удалять таблицу (возможно, не самую лучшую привычку формировать), я прокомментировал первый (оригинальный) файл миграции, который создал таблицу Users, а затем оставил файл миграции проекта как есть. Повторно выполнил миграцию, и она отлично работала.
Как оказалось, файл Devise не вызывал проблемы; Я вижу, что это "изменение" таблицы, а не "ее создание", а это означает, что даже без установки devb: migrate, вероятно, вызвало бы такую же проблему (хотя я ее не тестировал).
Ответ 9
Если вы хотите сохранить свои данные, переименовать таблицу, но сделать это в процессе миграции, чтобы сэкономить время, а затем удалить его после выполнения миграции. p >
Поместите в верхнюю часть раздела вверх файла миграции.
rename_table :users, :users2
Ответ 10
Если ваше приложение новое и вас не волнуют данные в вашей базе данных, просто:
rake db:reset