Подтвердить что ты не робот

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)

Я следую учебнику и довольно трудно понять, почему это происходит. Кто-нибудь может объяснить, что происходит?

4b9b3361

Ответ 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