Перенос данных между базами данных с разными схемами
Возможно, вопрос идиотский, я полный новичок в руби. Мне кажется, должно быть какое-то очень простое решение на рельсах, но я в упор не могу его нагуглить.
Представьте себе следующую задачу:
1) Существует десктопная программа с графическим, написанная на qt.
2) Программа предназначена для составления специальных словарей, написана через пень-колоду из-за очень сжатых сроков и обладает следующими неприятными моментами:
а) все данные хранятся в множестве sqlite3 баз данных
б) каждый словарь — отдельная база
в) увы (да-да, так не делают, но в данном случае это было необходимо), но блобы тоже хранятся прямо в sqlite3. Там же закодирован тип содержимого, т.е все данные легко восстановимы
г) схема базы изначально была составлена с учётом некоторых не существенных с точки зрения вопроса особенностей
3) Прямо сейчас я пишу веб-приложение для представления всех этих словарей
4) В этом приложении все базы предполагается слить в одну
5) Схема таблиц довольно существенно изменилась, но в целом, модели данных легко отображаются одна на другую в обе стороны.
Изначальная мысль заключалась в том, чтобы написать специальное веб-приложение конвертер, который принимал бы к себе на вход файл sqlite (заполненный словарь), последовательно обходил бы всё содержимое базы со связями, составлял бы промежуточное представление и заливал бы напрямую через контроллер полученные данные в основную базу.
Список проблем:
1) Не понимаю, можно ли каким-то образом в ruby-on-rails динамически цепляться к двум базам (т.е с одной соединение держать постоянно, а к второй — залитой sqlite базе — подключаться на лету, считывать из неё все и заливать в основную)
2) Если нельзя это делать на лету, как это правильно делать статически?
3) В целом, можно было бы написать конвертер на чистом SQL, но тогда может оказаться отдельным геморроем переносить файлы из блобов в paperclip (ну или carrierwave). Ведь так?
Очень хотел бы услышать советы, как всё сделать правильно. Да, о том, что я дятел и сам себе злобный буратино, я знаю, но всё-таки
Просто одни модели подключаете к основной базе, другие — ко второй. Т.е. возможно у вас появятся модели-дубликаты, одинаковые по структуре, но подключенные к разным БД. Вот и все. Или я чего не понял?
Спасибо! В таком варианте тоже годится (ну я же писал, что я дятел и новичок)
Но на первый пункт это не отвечает — я имел в виду, что составители словарей, которые делают их в оффлайновой программе, заходили бы на специальную страничку, где могли бы залить файл с заполненным словарём, а программа на руби сама бы к этой базе подключилась без правок в конфигурации, выкачала бы все данные и залила в основную базу — возможно ли это?
Да, и той, и другой полностью известны. Обе писал я, просто в оффлайновой версии без костылей обойтись нельзя было никак, а в централизованную базу их переносить совсем не хочется
Но не знаю, наверное можно проще.
Если базы закачиваются не по несколько раз в час, можно сделать так, чтобы они закачивались с единственным названием файла, который и прописан будет в конфиге. Т.е. юзер закачивает и жмакает кнопку «Экспорт данных» — и приложение перегоняет данные из sqlite в основную базу, потом уничтожает файл, ну или автоматически все происходит.
О, а вот это хорошая мысль, я не догадался до этого. Только надо не продолбать правильную смену соединений. Словари будут заливать сначала штук пять за раз (но я смогу объяснить, что не стоит напирать слишком настойчиво), а потом где-то по одному раз в два месяца
*я просто когда за это дело брался, не знал, что в руби соединения статические(