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