Подтвердить что ты не робот

Есть ли массив миграции базы данных Ruby, который помогает перемещать содержимое из старой структуры в новую структуру?

Есть ли какие-либо камни/библиотеки Ruby, которые помогут вам перейти от старой структуры БД к новой структуре? Миграции ActiveRecord хорошо справляются с отслеживанием новой структуры db, но мне интересно, есть ли что-то, что поможет вам перенести весь старый db в новую структуру:

transfer_from(:source_table => 'person', :destination_table => 'dudes_and_dudets') do

  from :name, :to => :full_name

  from :dob, :to => :age do |dob|    # this would, for example, load the result  
    (Date.today - dob)/60/60/24/365  # of the block into :age
  end

end

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

Бернса

4b9b3361

Ответ 1

Я начал работать над этим.

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

http://github.com/btelles/legacy_migrations

изменить:

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

Это также на gemcutter/rubygems: gem install legacy_migrations

Ответ 2

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

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

Я признаю, что ваш пример хорош и краток, но здесь обычный пример миграции:

class FooBar < ActiveRecord::Migration
  def self.up
    # This is only needed if the new table will have the same name.
    # Move the old one aside.
    rename_table :users, :old_users

    # The new table structure
    create_table :users do |t|
      t.string :full_name
      t.date   :age
    end

    # Data migration
    OldUsers.all.each do |orig|
      User.create!(
        :full_name => orig.name,
        :age => (Date.today - orig.dob)/60/60/24/365
      )
    end

    # Clean up
    drop_table :old_users
  end

  def self.down
    # Exercise for the reader!
  end
end

# Temporary class for accessing the old table during conversion
class OldUsers < ActiveRecord::Base; end

Ответ 3

Мне нужно было сделать что-то вроде (что я думаю), которое вы описываете, и я использовал Sequel. Sequel адаптируется и в целом полезна и может работать с SQL непосредственно довольно удобным способом и может обращаться к нескольким различным типам БД.

Документация очень удобна, и я рекомендую ее полностью.

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

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

Ответ 4

Существует немало для перемещения баз данных без преобразований. Я помню, как ребята из Rails Envy говорили о драгоценном камне (но это время назад, и у меня нет времени, чтобы копать). Посмотрите на railsenvy.com?

Ответ 5

Посмотрите Trucker Gem, он отлично подходит для переноса устаревших данных в приложение Rails. Он создает активные объекты записи для каждой таблицы в старой базе данных и помещает их в приложение /models/legacy. Внутри этих классов вы можете определить, как они отображаются на ваших новых классах.

Ответ 6

  • настройте свою базу данных в config/database.yml
  • rake db:schema:dump
  • преобразовать schema.rb в db/migrate/001_create_database.rb
  • вы можете создать другую миграцию для сохранения схемы базы данных