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

582

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

rake db:recreate

Это возможно?

AnApprentice
источник
Я бы посоветовал заглянуть за самый высокий голос. На мой взгляд, rake db:drop db:create db:schema:loadможет быть более подходящим, чем rake db:drop db:create db:migrate(хотя я готов ошибаться в этом).
Джейсон Светт
Возможно дублирование Сброс базы данных (очистка всех), затем
начальная
2
rake db:drop db:create db:migrate
Уильям Хэмпшир
db:drop + db:create + db:migrate == db:migrate:reset, Я обычно прибегаю к тому db:schema:load, когда миграции нарушаются. Мне редко нужно воссоздавать базу данных, поэтому скорость не имеет большого значения. Кроме того, если у вас есть непримененные миграции, db:schema:loadи db:resetвы не будете их применять. Не уверен, что это большая часть аргумента.
x-yuri

Ответы:

1074

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

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

rake db:reset db:migrate

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

rake db:drop db:create db:migrate

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

thenengah
источник
36
Кажется, он rake db:resetтакже запускает все миграции (по крайней мере, на Rails 3), так что это должно быть все, что нужно, верно?
Плиндберг
1
Или, скорее, он оставляет схему, идентичную той, что была бы у всех миграций. Но миграции не выполняются сами по себе (поэтому, если у вас есть миграции, которые вставляют данные, этого не произойдет; для этого вам действительно нужно использовать файл db / seed.rb).
Плиндберг
1
Я знаю, что для приложения Tracks GTD db: migrate не работает. Мне пришлось сделать db: reset при переходе с Sqlite3 на Postgres.
Лабиринт
11
Вам также нужно будет запустить rake db:test:prepareтестирование, иначе вы получите сообщение об ошибке:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2
31
Кто-то должен прояснить это rake db:resetи rake db:drop db:create db:migrate сделать две совершенно разные вещи . Последний стирает всю базу данных приложения, воссоздает ее и затем проходит каждую миграцию, чтобы обновить схему ( db/schema.rbили db/structure.sql), но не заполняет ее начальными данными. Первый вместо этого - псевдоним для rake db:drop db:schema:load db:seed, поэтому он стирает всю базу данных приложения, но не обновляет схему , а затем заполняет начальными данными. Таким образом, если вы ничего не изменили в своих миграциях, первое быстрее, второе безопаснее.
Клаудио Флореани,
157

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

$ rake db:schema:load

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

Энеко Алонсо
источник
6
работает для рельсов 3, а также. полезно, когда вы только что испортили свою тестовую базу данных и хотите сбросить ее до рабочей версии, соответствующей вашей базе данных разработчика
bigpotato
Спасибо за это. Я не осознавал этого db:dropи db:createбыл излишним.
Грант Бирчмейер
3
Это не обновляет схему, не является безопасным способом, если вы реорганизуете свои миграции.
Клаудио Флориани,
это лучший ответ для меня.
roxdurazo
2
@ClaudioFloreani рефакторинг миграций вызывает проблемы. Как только они бегут, их нужно оставить в покое, навсегда.
августа
45

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

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

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

К настоящему времени вы можете легко «связать» задачи Rails:

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+
ТЗ.
источник
12
Это будет запускать все ваши миграции одна за другой, которая не масштабируется и подвержена ошибкам. Кроме того, я почти уверен, что db: migrate обновляет ваш schema.rb, поэтому ваша схема: dump ничего полезного не делает.
Coreyward
Так как же очистить базу данных? в разработке ... очистить все это.
Ученик
3
@AnApprentice Вы можете запустить db:reset, который находится всего в Google (или проверить руководства ). Мой комментарий не для того, чтобы советовать против этого, а для того, чтобы не использовать db:migrateто, что вам действительно нужно db:schema:load.
Coreyward
7
Кстати, @TK, вам действительно не нужно запускать все это как отдельные процессы в зависимости от состояния выхода последнего. Вместо этого, просто передать все требуемые задачи rake, например: rake db:drop db:create db:schema:load.
Coreyward
1
Это анекдотично, но у меня никогда не возникало проблем с запуском db:migrate... в то время как db:schema:loadон чувствителен к тому, что кто-то забыл проверить schema.rb в системе контроля версий вместе с новой миграцией.
Джон Фип
37

Обновление: в Rails 5 эта команда будет доступна через эту команду:

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


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

rake db:purge 

Источник: коммит

# 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
Робби Гилфойл
источник
Как говорит @bekicot на простом английском языке, db:purge«удали все данные, но сохрани все таблицы и столбцы»
MCB
@MCB Я был неправ, извините, я db:purge не сохраняю таблицы.
Яна Агун Сисванто
29

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

rake db:create

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

rake db:schema:load

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

coreyward
источник
1
Сначала вы должны удалить базу данных ... или вы можете просто удалить таблицы, если хотите.
Coreyward
5
+1 для загрузки схемы. иногда миграции перепутаны, но схема должна быть неизменной.
Дэнни
В The Rails 3 Way я прочитал, что загрузка схемы - это путь, а не запуск всех миграций. Я не помню точно, каковы были их рассуждения, но, похоже, это имеет смысл. Если конечный результат в любом случае одинаков, то кажется, что проще и менее подвержено ошибкам просто загрузить базу данных из схемы, чем выполнить несколько миграций.
Джейсон Светт
3
Причина заключается в том, что миграция предназначена для переноса данных и со временем становится все более хрупкой по мере изменения ваших моделей. Вы можете (и должны) запекать модели с минимальной областью действия в своих миграциях, когда это возможно, чтобы гарантировать их выполнение, но это не очень хорошо масштабируется и намного менее эффективно, чем просто построение базы данных из того, что приложение знает как конечную точку , Зачем полагаться на миграцию для создания базы данных, которая выглядит как ваша схема, если вы можете просто построить из самой схемы?
Coreyward
13

Из командной строки запустите

rake db:migrate:reset
user2747051
источник
это единственный способ заставить приложение снова выполнить все миграции. Потому что каждая миграция вносит изменения, schema.rbи если вы только dropи create, migrateничего не будете делать (проверено на рельсах 6)
шампунь
12

Используйте как

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

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

db: drop - удалит базу данных

db: create - создаст базу данных (хост / db / пароль будет взят из config / database.yml)

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

db: seed - будет запускать возможные данные из каталога (db /igration / seed.rb) .

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

rake db:reset

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

Ура!

Маниш Шривастава
источник
1
Мне нравится добавлять db: test: подготовиться к этому, для хорошей меры. Это, конечно, зависит от того, тестируешь ты или нет.
ctc
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 - разработка , в случае, если вы видите исключение в тестах спецификаций, вы должны заново создать db для тестовой среды следующим образом:

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

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

rake db:test:prepare

или

RAILS_ENV=test rake db:seed

Кроме того, чтобы использовать задачу воссоздания, вы можете добавить в 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
Малъ Скрылевъ
источник
8

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

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
user1358180
источник
4

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

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

А затем снова перенести БД

$bundle exec rake db:migrate 
Куш
источник
4

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

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

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

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

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

зависимые у вас хотят использовать существующую schema.rb

Александр Бабак
источник
2

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

rake db:reset
Виктор
источник
1

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

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

и в терминале вы побежите

rake db:all

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

Обед Лориссон
источник
1

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

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed
Торин
источник
1

Просто ты можешь бежать

rake db:setup

Он удалит базу данных, создаст новую базу данных и заполнит базу данных из начального числа, если вы создали исходный файл с некоторыми данными.

Тусиф Муртаза
источник
1

3 варианта, тот же результат:

1. Все шаги:

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2. Сброс:

  $ rake db:reset          # drop / schema:load / seed

3. Миграция: сброс:

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

Ноты:

  • Если используется схема: нагрузка быстрее, чем все миграции, но результат тот же.
  • Все данные будут потеряны.
  • Вы можете запустить несколько граблей в одной строке.
  • Работает с рельсами 3.
Urko
источник
0

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

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

rake db:migrate

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

rake db:reset

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

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
ardochhigh
источник