2015-06-01 2 views
0

Я добавляю миграцию, которая добавляет уникальный индекс в таблицу MySQL. Существует ли какой-либо реальный риск усечения любых существующих данных в таблице, чтобы можно было добавить уникальный индекс, учитывая, что существующие данные в таблице могут быть не уникальными?Является ли рискованным обрезать таблицу во время миграции БД Rails?

Важно отметить, что это приложение все еще находится в разработке и еще не выпущено на производство, и поэтому мы не потеряем реальных данных пользователя.

Может ли кто-нибудь придумать реальный сценарий, в котором мы можем потерять важные данные по линии?

Пример кода миграции:

class AddUniqueIndexToFooOnBarAndBaz < ActiveRecord::Migration 
    def up 
    ActiveRecord::Base.connection.execute("TRUNCATE foo") 
    add_index :foo, [:bar_id, :baz_id], unique: true 
    end 

    def down 
    remove_index :foo, [:bar_id, :baz_id] 
    end 
end 

ответ

2

Т.Л., ЛУ вы ничего не испортите на самом деле, но не делают этого TRUNCATE в любом случае. Сделайте db:reset

Что происходит, когда вы пишете миграции является то, что файл db/schema.rb получает изменен и его версия устанавливается на отметку времени на последней миграции, которая была запущена. Файлы миграции существуют так, что:

  1. У вас могут быть конкретные файлы, которые демонстрируют изменения в базе данных с течением времени, используя DSL, что имеет смысл.
  2. Вы можете откатить изменения, внесенные в базу данных пола произвольно, если вы обнаружите что-то не так в процессе разработки (не откатить вашу продукцию DB, просто написать новую миграцию)

Это означает, что миграционные файлы должны показать, что вы делаете с базой данных, и что TRUNCATE на самом деле не то, что вы делаете с БД, это то, что вы делаете с данными . Он ничего не сломает и что фрагмент SQL не будет запущен, если вы развернете новую среду с помощью схемы, которая уже перенесена, но для любой среды, которая уже завершена, это произойдет. Это просто странно и определенно не нужно.

ПОДРОБНО.Подробнее

Что происходит при развертывании приложения в первый раз в среде есть вы (должны) запускать rake db:create db:schema:load db:seed или rake db:setup (который только хутора к другим командам). db:schema:load просто преобразует ваш файл schema.rb в фактическую схему базы данных, с таблицами и индексами и всем этим интересным материалом. После запуска миграции ваш файл схемы будет иметь нужный вам индекс. Затем, всякий раз, когда вы развертываете производство, ваша база данных будет выглядеть так, как будто вы хотите, чтобы она была вне коробки, прежде чем какие-либо данные будут добавлены.

В разработке вы не должны прикрепляться к каким-либо данным, находящимся в вашей базе данных, - это тестовые данные, несущественные и эфемерные. Вы не должны чувствовать себя плохо, вытирая все это, особенно если вы усекаетесь, потому что существующие данные могут быть недействительными/дублируемыми.

+0

Моя цель в усечении состояла в том, чтобы не перезагружать весь db, чтобы минимизировать влияние этой миграции для других разработчиков моей команды. Так что просто вытирание этой таблицы было правильным, чтобы миграция стала проще всего проходить. Не могли бы вы согласиться с тем, что усечение будет соответствовать этому случаю? Или у вас есть более «хирургическая» альтернатива db: reset, которая не является усечением? –

+0

Что вы делаете, это не прикладная логика, она работает. Поэтому он не должен сохраняться в вашем приложении (т. Е. Записываться в перенос). Просто перейдите в консоль SQL или rails ('Model.destroy_all'), чтобы сделать это. – ABMagil

+0

Возможно, но существует более чем несколько примеров людей (Google для миграции данных с помощью рельсов) с использованием миграции Rails для более чем простого изменения структуры БД, то есть миграции/изменения данных, либо до/после изменения структуры БД. –

0

Усечение таблицы имеет последствия, если вы используете миграцию рельсов или нет. Лучший вопрос - спросить, рискованно ли урезать таблицу, период.

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

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

Короче говоря, есть риски, но лучший человек, чтобы ответить на уровень этого риска, - это вы.

+0

Интересный вопрос об целостности данных общей БД, которую я не рассматривал. В этом случае это не таблица соединений, и нет внешних ключей, указывающих на эту таблицу. –

Смежные вопросы