Втратив мою схему.rb! Чи можна його регенерувати?


133

Через деякі проблеми з розгортанням я зупинив відстеження schema.rb в git. Якось я це заповнив і десь по дорозі мій файл schema.rb зник.

Чи є спосіб відновлення schema.rb з бази даних або міграцій? Я вважаю за краще не втрачати існуючі дані.

Відповіді:


230

Якщо ви запустили, rake -Tвін перерахує всі можливі завдання граблі для вашого проекту Rails. Один з них - db: schema: dump, який відтворить schema.rb для програми Rails з бази даних.

bundle exec rake db:schema:dump

Велике спасибі, багато відповідей, але схоже на те, що ви були першими (просто) такими для вас. Цікаво, чи це генерує схему з самої бази даних або від міграцій?
брад

7
З самої бази даних, тому будьте обережні, чи є зміни, що відбулися поза міграціями.
mguymon

1
schema.rb як і раніше містить порожню схему після rake db:schema:dumpна рейках 2.0
Буде Хардвік-Сміт

Мій файл schema.rb залишається точно таким же після запуску вищезазначених команд
stevec

59

Обережно,

rake db:schema:dump

скидає поточну схему БД З БД . Це означає, що якщо ви внесли якісь зміни в міграції, вони НЕ будуть відображені у файлі schema.rb, який не є тим, що потрібно IMO.

Якщо ви хочете заново створити схему з міграцій, виконайте наступне:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate

1
Це призведе до втрати даних, яких ОП заявила, що хоче уникнути. До того ж, як зазначає Колін, регенерація бази даних виключно від міграцій потенційно є дуже поганою ідеєю через збільшену можливість натрапити на проблеми з незвичайними залежностями (взагалі кажучи). Якщо є міграції, що очікують на розгляд, було б, ймовірно, найкраще запустити останні міграції на розроблювальній машині, а потім виконати rake db:schema:dumpкоманду.
Пол Ріхтер

4
Кожне полотно чітко пояснено у моїй відповіді. Я покусав ТОЧНО, запускаючи лише схему: скидаючи та не отримуючи чистої схеми. ОП говорить про відстеження схеми в CVS. Я хотів би, щоб моя схема була узгоджена з моїми визначеннями під час міграцій, а не застаріла версія з виробничого БД або старої БД розробки
gamov

11
rake db:schema:dump

Я думаю, що це все ще справедливо в Rails 3 - він відновлює schema.rb з бази даних.


8

ЗАЛІЗНИКИ 5 Шлях:

rails db:schema:dump

або якщо Ви знайдете Gem :: LoadError, тоді:

bundle exec rails db:schema:dump

Примітка:

у рейках 5 рекомендується створювати / виконувати завдання за допомогою rails замість rake, це просто пам'ятати, рейки генеруватися завдання мають розширення .rakeсм в lib/tasks/myTask.rake. що означає, що ці завдання також можна виконати заздалегідь rake.


5

Якщо ви регенеруєте schema.rb місцево, ви повинні бути добре. Він просто містить представлення структури таблиць вашої бази даних. Самі дані не містяться в цьому файлі.

Щоб відновити schema.rbфайл, запустіть:

bundle exec rake db:schema:dump

Тоді просто введіть новий schema.rbфайл, і ви повинні бути в хорошій формі!


4

Безпосередньо з самого файлу schema.rb:

Якщо вам потрібно створити базу даних додатків в іншій системі, ви повинні використовувати db:schema:load, не виконуючи всі міграції з нуля. Останнє - це хибний і нестійкий підхід (чим більше міграцій ви накопичите, тим повільніше буде виконуватись і більша ймовірність виникнення проблем).

Тому НЕ робіть пропозицію rake db:migrate, яка була запропонована в момент написання цього запису - найнижчою оцінкою.


Ви, ймовірно, захочете запустити останні кілька міграцій, що очікують, якщо на вашій розроблювальній машині є такі, перш ніж регенерувати схему, але так, відновлення бази даних виключно від міграцій - дуже погана ідея, тим більше, що це призведе до втрати даних.
Пол Ріхтер

1

У мене також була подібна проблема, коли моя стара схема не оновлювалась, навіть якщо я видалив міграцію.

Отже, те, що я зробив, було скидання всіх існуючих таблиць у базу даних та перенесення їх знову. Потім команда "db: schema: load" дала мені свіжу schema.rb.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.