Очистить или восстановить базу данных Ruby on Rails

507

У меня есть база данных dev Ruby on Rails, полная данных. Я хочу удалить все и перестроить базу данных. Я думаю использовать что-то вроде:

rake db:recreate

Возможно ли это?

  • 0
    Я бы посоветовал заглянуть за самый высокий голос. По моему мнению, rake db:drop db:create db:schema:load может быть более подходящим, чем rake db:drop db:create db:migrate (хотя я готов ошибаться в этом).
  • 0
    Возможный дубликат сброса базы данных (очистить все), а затем заполнить базу данных
Показать ещё 2 комментария
Теги:
rake
ruby-on-rails-3

17 ответов

874
Лучший ответ

Я знаю два способа сделать это:

Это будет reset ваша база данных и перезагрузит вашу текущую схему всеми:

rake db:reset db:migrate

Это уничтожит ваш db, а затем создаст его, а затем перенесет вашу текущую схему:

rake db:drop db:create db:migrate

Все данные будут потеряны в обоих сценариях.

  • 33
    Кажется, rake db:reset также запускает все миграции (по крайней мере, на Rails 3), так что это должно быть все, что нужно, верно?
  • 1
    Или, скорее, он оставляет схему, идентичную той, что была бы у всех миграций. Но миграции не выполняются сами по себе (поэтому, если у вас есть миграции, которые вставляют данные, этого не произойдет; для этого вам действительно нужно использовать файл db / seed.rb).
Показать ещё 18 комментариев
143

В Rails 4 все необходимое

$ rake db:schema:load

Это приведет к удалению всего содержимого вашей БД и воссозданию схемы из файла schema.rb, без необходимости применять все миграции один за другим.

  • 5
    работает для рельсов 3 также. полезно, когда вы только что испортили свою тестовую базу данных и хотите сбросить ее до рабочей версии, соответствующей вашей базе данных разработчика
  • 0
    Спасибо за это. Я не осознавал, что db:drop и db:create избыточны.
Показать ещё 5 комментариев
38

Я использую следующий терминал в терминале.

rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

Я поместил это как псевдоним оболочки и назвал его remigrate

  • 12
    Это будет запускать все ваши миграции одна за другой, которая не масштабируется и подвержена ошибкам. Кроме того, я уверен, что db: migrate обновляет ваш schema.rb, так что ваша схема: дамп ничего полезного не делает.
  • 0
    Так как же очистить базу данных? в разработке ... очистить все это.
Показать ещё 4 комментария
26

Обновление: с появлением Rails 5 эта команда будет доступна с помощью этой команды:

rails db: purge db: create db: migrate RAILS_ENV = test


Начиная с новейшей версии рельсов 4.2 вы можете запускать:

rake db:purge 

Источник: commit

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

Он может использоваться вместе, как указано выше:

rake db:purge db:create db:migrate RAILS_ENV=test
  • 0
    Как говорит @bekicot простым английским языком, db:purge «удаляет все данные, но сохраняет все таблицы и столбцы».
  • 0
    @MCB Я был неправ, сожалею об этом, db:purge не сохраняет таблицы.
24

В зависимости от того, что вы хотите, вы можете использовать...

rake db:create

... для создания базы данных с нуля с config/database.yml или...

rake db:schema:load

... для создания базы данных с нуля из вашего файла schema.rb.

  • 0
    это просто говорит вам "уже существует"
  • 1
    Сначала вы должны удалить базу данных ... или вы можете просто удалить таблицы, если хотите.
Показать ещё 3 комментария
11

Использовать как

rake db:drop db:create db:migrate db:seed

Все в одной строке. Это происходит быстрее, так как среда не перезагружается снова и снова.

db: drop - отбросит базу данных.

db: create - создаст базу данных (host/db/password будут взяты из config/database.yml)

db: migrate - запустит существующие миграции из каталога (db/migration/.rb) *.

db: seed - запустит данные семян из каталога (db/migration/seed.rb)..

Я обычно предпочитаю:

rake db:reset

сделать все сразу.

Ура!

  • 1
    Мне нравится добавлять db: test: подготовиться к этому, для хорошей меры. Это, конечно, зависит от того, тестируешь ты или нет.
  • 0
    db:reset == db:drop + db:schema:load + db:seed , db:migrate:reset == db:drop + db:create + db:migrate
11

Просто выполните последовательность шагов: отбросьте базу данных, затем заново создайте ее, перенесите данные и, если у вас есть семена, заселите базу данных:

rake db:drop db:create db:migrate db:seed

Поскольку среда по умолчанию для rake - это разработка, в случае, если вы видите исключение в тестах spec, вы должны повторно создать db для тестовой среды следующим образом:

RAILS_ENV=test rake db:drop db:create db:migrate

В большинстве случаев тестовая база данных посеяна во время тестовых процедур, поэтому выполнение задачи db:seed не требуется. В противном случае вы должны подготовить базу данных:

rake db:test:prepare

или

RAILS_ENV=test rake db:seed

Кроме того, чтобы использовать задачу rereate, вы можете добавить в Rakefile следующий код:

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

Затем выполните:

rake db:recreate
9

В командной строке выполните

rake db:migrate:reset
7

Вы можете сделать вручную:

rake db:drop
rake db:create
rake db:migrate

Или просто rake db:reset, который выполнит вышеуказанные шаги, но также запустит ваш файл db/seeds.rb.

Добавленный нюанс заключается в том, что rake db:reset загружается непосредственно из вашего файла schema.rb, а не снова запускает все файлы миграции.

Данные удаляются во всех случаях.

6

Вы можете использовать следующую командную строку:

rake db:drop db:create db:migrate db:seed db:test:clone
4

На рельсах 4.2 удалить все данные, но сохранить базу данных

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md

  • 0
    Хорошо ... Только что попробовал, но он не сохраняет таблицы и столбцы. Вы должны запустить db: migrate после запуска db: purge. Так что это не сохраняет таблицы и столбцы. Однако он сохраняет саму базу данных, поэтому вам не нужно делать db: create
  • 1
    @ Седрик Вы правы, дб: чистка не сохранить таблицу. Я обновил код.
4

Чтобы удалить определенную базу данных, вы можете сделать это на консоли rails:

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

И затем снова перенастройте DB

$bundle exec rake db:migrate 
3

Вы можете использовать db:reset - для запуска db: drop и db: настройка или db:migrate:reset - выполняется db: drop, db: create и db: migrate.

зависит от того, что вы хотите использовать, существует schema.rb

2

В соответствии с Rails guide, этот один лайнер должен использоваться, потому что он будет загружаться из schema.rb вместо перезагрузки файлов миграции один на один:

rake db:reset
1

Я думаю, что лучший способ запустить эту команду:

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed
1

Поскольку в разработке вы всегда хотите воссоздать базу данных, вы можете определить задачу рейка в своей папке lib/tasks.

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

а в терминале вы запустите

rake db:all

он восстановит вашу базу данных

0

Сегодня я сделал немало изменений в моей схеме рельсов. Я понял, что мне нужны еще две модели в иерархии, а некоторые другие - для удаления. Для моделей и контроллеров потребовалось много небольших изменений.

Я добавил две новые модели и создал их, используя:

rake db:migrate

Затем я редактировал файл schema.rb. Я вручную удалил старые модели, которые больше не нужны, изменил поле внешнего ключа по мере необходимости и немного изменил его порядок, чтобы сделать его более ясным для меня. я удалил все миграции, а затем повторно запустил сборку через:

rake db:reset

Это сработало отлично. Разумеется, все данные должны быть перезагружены. Рельсы поняли, что миграции были удалены, и reset знак высокой воды:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню