rake db: schema: load vs. migrations


171

Тут дуже просте запитання - якщо міграція може ставати повільною і громіздкою, оскільки додаток стає складнішим, і якщо у нас набагато чистіше rake db:schema:loadзателефонувати, то чому взагалі існують міграції?

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


Обережно:

З відповідей на це питання: rake db:schema:load буде видалено дані на виробничому сервері, тому будьте обережні при використанні.


5
+1 я ніколи не розумів мети міграцій; чому б не просто керувати версією схеми?
альтернатива

5
@alternative - міграції дозволяють виконувати інші речі, наприклад, якщо вам потрібно додати ненульовий стовпець, ви можете спритно заповнити цей стовпець даними, замість того, щоб використовувати якесь значення за замовчуванням.
Джош М.

Відповіді:


208

Міграція забезпечує зміну кроку в базі даних вперед та назад. У виробничому середовищі слід додатково вносити зміни до бази даних під час розгортань: міграції забезпечують цю функціональність відмовою відкату. Якщо ви працюєте rake db:schema:loadна виробничому сервері, ви видалите всі свої виробничі дані. Це небезпечна звичка потрапляти.

Зважаючи на це, я вважаю, що це є пристойною практикою час від часу "згортати" міграцію. Це тягне за собою видалення старих міграцій, заміну їх на одну міграцію (дуже схожу на ваш schema.rbфайл) та оновлення schema_migrationsтаблиці, щоб відобразити цю зміну. Будьте дуже обережні, роблячи це! Ви можете легко видалити свої виробничі дані, якщо не будете обережні.

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


80
дякую, що повідомили, що rake db: schema: load видаляє всі виробничі дані!
Магне

2
Замість того, щоб замінити "згорнуті" міграції на нову, що імітує схему, я написав дорогоцінний камінь, який просто очищає їх, і спонукає користувачів використовувати, db:schema:loadякщо вони намагаються зіткнутися db:migrateз новою установкою. @ Clear_migrations
Ярина

Можливо, явна відповідь, але перед першим натиском на виробництво ви рекомендуєте просто видалити всі міграції та використовувати db.schema як першу міграцію?
dtc

30

Я просто наткнувся на цю посаду, що давно і не побачив відповіді, яку я очікував.

rake db:schema:loadце чудово, коли ви вперше поставили систему у виробництво. Після цього слід виконати міграцію нормально.

Це також допомагає вам очищати міграцію, коли завгодно, оскільки схема має всю інформацію про виробництво інших машин, навіть коли ви очищаєте свої міграції.


Отже, ви можете "очистити" свої міграції, оскільки ніколи не потрібно їх використовувати? Звучить як химерне твердження.
Abe Petrillo

Мені незрозуміло, у чому db:schema:loadполягає користь , окрім як гоління на кілька секунд протягом усього циклу розвитку. Ви коли-небудь працювали з додатком, на створення якого пішло більше 30 секунд? В даний час я працюю над додатком, у якому є помилки у файлах міграції, і він ніколи не мігруватиме, не матимуть жодних виправлень помилок або не працює, db:schema:loadщо змушує мене думати про схему.
Ninjaxor

Ще один аргумент, який я висловлю для збереження міграції, полягає в тому, що основна команда рейкових рейсів спрямовує користувачів instead of editing schema.rb, please use the migrations feature. Отож, якщо ви працюєте db:schema:loadз автоматично створеним файлом, у якого немає переносів для автоматичного генерування знову, ви ефективно проходите маршрут ручного "редагування" схеми та відключення міграцій. Мені б хотілося, щоб у мене було цитування цього посібника з рейок, але вони не обговорюють схему: load, що страшно додає моїх розчарувань у вирішенні питання про те, як підійти до функції schema: load. = /
Ninjaxor

Я прийшов на цю сторінку саме тому, що з цим згоден. Мій досвід полягає в тому, що після створення сайту, набагато безпечніше використовувати міграцію, щоб змінити його. Незважаючи на це, коментарі початку db / schema.rb вказують точно навпаки! (У мене є проблема на початку кожного проекту, тому що я забуваю поставити db / schema.rb в .gitignore ...)
user1251840

@AbePetrillo Нічого цього коментаря я повністю не пропустив. Звичайно, ні, я мав на увазі те, що ви можете очистити старі міграції, які були виконані на всіх виробничих машинах, якщо хочете. Протягом багатьох років я постійно тримав їх навколо, але мій "допомагає вам очищати міграції, коли завгодно", заява не означала, що "мені ніколи не доведеться використовувати міграції". Отже, коли ви розгортаєте нову машину, запустіть rake db:schema:loadна відміну від rake db:migrate. Тоді звідти можна rake db:migrate.
ereslibre

9

Міграція дозволяє також додавати дані в db. але db: schema: load завантажує лише схему.


6

Оскільки міграції можна повернути назад та забезпечити додатковий функціонал. Наприклад, якщо вам потрібно змінити деякі дані як частину зміни схеми, вам це потрібно зробити як міграція.


4

Як користувач інших ORM, мені завжди здавалося дивним, що у Rails не було функції синхронізації та оновлення. тобто, використовуючи файл схеми (який представляє всю сучасну схему), пройдіть існуючу структуру БД та додайте / видаліть таблиці, стовпці, індекси за потребою.

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


1
Завдання перенести базу даних з даними з однієї складної схеми в іншу не є тривіальною. Він може не бути вирішений автоматично, і дані можуть не послідовно мігруватися за допомогою одного кроку. Міграція рейок є головним і схема залежить. Схема автоматично відтворюється з кожною міграцією, але не навпаки.
оклас

Рейки власних довідників прямо вказують, що schemaце головний, а не міграційний процес.
Дренмі

0

Я вже розмістив коментар, але вважає, що краще розмістити коментарі до файлу db / schema.rb тут:

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

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


0

rake db:migrateналаштування таблиць у базі даних. Коли ви запустите команду міграції, вона буде шукати в db / migrate / для будь-яких рубінових файлів і виконувати їх, починаючи з найстарішого. На початку кожного імені файлу міграції є позначка часу.

На відміну від rake db:migrateзапущених міграцій, які ще не запущені, rake db:schema:loadзавантажує схему, яка вже створена в db/schema.rbбазу даних.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.