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


582

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

rake db:recreate

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


Я бы посоветовал заглянуть за самый высокий голос. На мой взгляд, 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

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


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файла.


1
Сначала вы должны удалить базу данных ... или вы можете просто удалить таблицы, если хотите.
— Coreyward

5
+1 для загрузки схемы. иногда миграции перепутаны, но схема должна быть неизменной.
— Дэнни

В The Rails 3 Way я прочитал, что загрузка схемы - это путь, а не запуск всех миграций. Я не помню точно, каковы были их рассуждения, но, похоже, это имеет смысл. Если конечный результат в любом случае одинаков, то кажется, что проще и менее подвержено ошибкам просто загрузить базу данных из схемы, чем выполнить несколько миграций.
— Джейсон Светт

3
Причина заключается в том, что миграция предназначена для переноса данных и со временем становится все более хрупкой по мере изменения ваших моделей. Вы можете (и должны) запекать модели с минимальной областью действия в своих миграциях, когда это возможно, чтобы гарантировать их выполнение, но это не очень хорошо масштабируется и намного менее эффективно, чем просто построение базы данных из того, что приложение знает как конечную точку , Зачем полагаться на миграцию для создания базы данных, которая выглядит как ваша схема, если вы можете просто построить из самой схемы?
— Coreyward

13

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

rake db:migrate:reset

это единственный способ заставить приложение снова выполнить все миграции. Потому что каждая миграция вносит изменения, 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

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.

0

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

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

rake db:migrate

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

rake db:reset

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

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.