0

В rails проекте используется mysql БД для хранение active record моделей.

Есть ли простой способ сформировать "копию" набора active record записей в sqlite базу?

Пока видеться, что надо пройтись по всем данным нужных моделей, и сформировать sql, который надо выполнить на коннекшене к sqlite.

Либо же, подготовить sqlite базу (путём вызова миграций на ней), а потом пройтись по всем объектам моделей из Mysql и делать save, но в sqlite базу. Хм. Я так понимаю, что достаточно понять как работать одновременно с двумя источниками данных для active record?

4
  • а сделать дамп mysqldump -u USER -pPASSWORD DATABASE TABLE1 TABLE2 TABLE3 > /path/to/file/dump_table.sql а потом его в sqlite подгрузить? да, возможно нужно будет файл дампа чуточку поправить.
    – KoVadim
    27 июл 2014 в 15:23
  • @KoVadim, Хочется этот процесс автоматизировать, как перенести "руками" - масса вариантов. Хочется именно в идеологи active record & ruby.
    – Чад
    27 июл 2014 в 15:27
  • @Чад > Хочется именно в идеологи active record & ruby. вести миграции?
    – etki
    27 июл 2014 в 18:03
  • @Etki - причём тут миграции? Прогон миграций можно использовать для формирования структуры sqlite базы.
    – Чад
    28 июл 2014 в 16:15

1 ответ 1

1

Тихо сам с собою, я веду беседу... :-)

В итоге применил следующую схему:

work_connection = ActiveRecord::Base.configurations[Rails.env]

out_connection = {'adapter' => 'sqlite3',
            'database' => "#{Rails.root}/tmp/#{Time.now.to_i.to_s}.sqlite3"}
#здесь загружаем данные для копирования
model_data = SomeModel.all
#Переключаем на внешнюю базу
ActiveRecord::Base.establish_connection(out_connection)
#Прогоняем миграции
ActiveRecord::Migrator.migrate('db/migrate', nil)
#сохраняем данные
model_data.each do |obj|
  dst = SomeModel.new
  assign_values obj, dst
  dst.save!
end
#Переключаем обратно
ActiveRecord::Base.establish_connection(work_connection)

...
def assign_values(src, dst)
  src.attributes.each do |name, val|
    dst.send "#{name}=".to_sym, val
  end
end

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.