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


582

У мене є база даних розроблених Ruby on Rails, повна даних. Я хочу все видалити і відновити базу даних. Я думаю використовувати щось на кшталт:

rake db:recreate

Чи можливо це?


Я б запропонував проглянути повз відповідь, що найбільше відповідає. На мою думку, це rake db:drop db:create db:schema:loadможе бути більш доречним, ніж rake db:drop db:create db:migrate(хоча я готовий помилитися з цим).
Jason Swett


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

Це знищить ваш db, а потім створить його, а потім перемістить вашу поточну схему:

rake db:drop db:create db:migrate

Усі дані будуть втрачені в обох сценаріях.


36
Здається, rake db:resetтакож виконуються всі міграції (принаймні, на Rails 3), так що повинно бути все, що потрібно, правда?
plindberg

1
Або, скоріше, він залишає схему ідентичною тій, яку виконували б усі міграції. Але міграції не виконуються самі по собі (тому, якщо у вас є міграції, які вставляють дані, цього не відбудеться; для цього слід дійсно використовувати файл db / seed.rb).
plindberg

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

На рейках 4 все необхідне є

$ rake db:schema:load

Це видалило б весь вміст у вашій БД і відтворило схему з вашого файла schema.rb, без необхідності застосовувати всі міграції по черзі.


6
працює також для рейок 3. корисно, коли ви просто зіпсували тестову базу даних та хочете її скинути до робочої версії, яка відповідає вашому dev db
bigpotato

Дякую за це Я цього не усвідомлював db:dropі db:createбув зайвим.
Грант Бірхмайєр

3
Це не оновлює схему, не є безпечним способом, якщо ви переробляєте свої міграції.
Клаудіо Флореані

це найкраща відповідь для мене.
roxdurazo

2
@ClaudioFloreani рефакторинг міграцій задає проблеми. Як тільки вони біжать, їх слід залишати в спокої, назавжди.
nrowegt

45

Я використовую наступний один вкладиш у Terminal.

$ 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 в контролі версій поряд з новою міграцією.
johncip

37

Оновлення: у Rails 5 ця команда буде доступна за допомогою цієї команди:

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


З найновішим випуском рейки 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, що завантаження схеми - це шлях, на відміну від запуску всіх міграцій. Я точно не пам’ятаю, якими були їхні міркування, але, здається, це має сенс. Якщо кінцевий результат в будь-якому випадку однаковий, здається, простіше і менш схильне до помилок просто завантажити базу даних зі схеми, ніж виконати купу міграцій.
Jason Swett

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 - створить базу даних (host / db / password буде взято з config / database.yml)

db: migrate - запустить існуючі міграції з каталогу (db / migration / .rb) *.

db: seed - запустить можливі дані насіння з каталогу (db / migration / 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
x-yuri

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

Крім того, для використання завдання відтворення ви можете додати в 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 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. Так це не зберігає таблиці та стовпці. Однак він зберігає саму базу даних, тому вам не доведеться дбати: create
Freddo

1
@Cedric Ви праві, db: чистка не зберігає таблицю. Я оновив код.
Яна Агун Сісванто

3

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

залежно від того, що ви хочете використовувати існує schema.rb


2

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

rake db:reset

1

Оскільки в процесі розробки ви завжди хочете відтворити базу даних, ви можете визначити завдання граблі в папці lib / task, як це.

  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

Він видалить базу даних, створить нову базу даних і заповнить db з насіння, якщо ви створили файл насіння з деякими даними.


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.