Существует ли гем миграции базы данных Ruby, который поможет вам переместить контент из старой структуры в новую? - PullRequest
11 голосов
/ 16 февраля 2010

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

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, но я надеюсь, магическая библиотека будет иметь гораздо больше преобразований.

Berns

Ответы [ 6 ]

3 голосов
/ 24 февраля 2010

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

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

http://github.com/btelles/legacy_migrations

редактировать :

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

Также на gemcutter / rubygems: gem install legacy_migrations

2 голосов
/ 19 февраля 2010

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

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

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

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
1 голос
/ 22 февраля 2010

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

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

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

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

0 голосов
/ 24 февраля 2011

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

0 голосов
/ 19 февраля 2010

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

0 голосов
/ 16 февраля 2010
  1. настроить вашу базу данных в config / database.yml
  2. rake db:schema:dump
  3. конвертировать schema.rb в db / migrate / 001_create_database.rb
  4. вы можете создать другую миграцию для поддержки схемы базы данных
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...