вопросу: есть две БД - рабочая и новая. Новая отличается от рабочей только тем, что в ней присутствует одно дополнительное поле в одной из таблиц и нет никаких данных, в остальном всё идентично. Нужно взять все данные из старой БД и переместить в новую. Как лучше правильно организовать передачу данных (мне пришла в голову идея использовать traverse_backup)? И как правильно "достучаться" из текущего узла до другой БД (она просто в виде копии лежит на диске)?
делай сырой запрос в старую базу на вычитывание всего множества и сохраняй в хорошо организованном подключении к новой базе
Развернуть бэкап и потом добавить поле было бы куда проще
Было бы проще, если бы механизм создания полей был стандартный, а тут сделано через erlsom (XML)
А как обратиться к новой БД, если у неё нет своей ноды?
ты что ли не про постгрес?
Про Mnesia)
Что мешает воспользоваться шеллом/gui?
Понятно
Мешает, что этот функционал надо встроить в готовый код для медиашлюза, и работать это должно по принципу "положил на шлюз БД -> запустил -> само всё обновилось".
> Как лучше правильно лучше и правильно зависит от требований (граничных условий)
Ну, у меня их нет пока, кроме того, чтобы это в принципе работало. Под "правильностью" я имел ввиду чтобы это был не совсем уж говнокод с т.з. того, как пишут на Erl)
что начит "говнокод" ведь вопрос сводится к переносу данных в новое хранилище? (т.е. обновление структуры методом переноса). я так понял раз вопрос возник значит сервис нельзя останавливать?
Нет, приложение останавливать можно, во всяком случае сейчас нет такого требования. А весь кейс возник сугубо из-за того, что текущая версия кода, которая при обновлении структуры БД всё генерирует заново, работает очень долго из-за слабости процессора. Подсунуть готовую пустую БД и перенести данные должно быть намного быстрее.
Ну, да. Весь вопрос: как, будучи внутри одной ноды, вытянуть все данные из БД ноды и записать данные в БД, которая просто лежит рядом на диске. И всё)
как тебе идейка: - читать из новой - при отсутствии данных - делать запрос в старую - записывать в новую - удалять из старой - удалить старую при опустении - профит
Так и собираюст делать
ну дык напиши функцию которая поле добавит
Для этого пришлось бы XML парсить, что противоречит самой идее использовать генерацию на основе XML)
Раскройте секрет: как? Я попробовал уже вариантов 5 точно, ни один из них не позволяет просто прочитать все записи без фильтра, даже код из книжки Армстронга
я вел речь про постгрес
Если кому интересно, то вот один из рабочих вариантов: read_data() -> TabNames = mnesia:system_info(tables), SelectAll = fun(Tables, Records) -> Handle = fun(_, [], Recs) -> Recs; (Fun, Tabs, Recs) -> [First | Rest] = Tabs, New = mnesia:dirty_select(First, [{'_', [], ['$_']}]), Fun(Fun, Rest, [New | Recs]) end, Handle(Handle, Tables, Records) end, Data = SelectAll(TabNames, []), Data.
Обсуждают сегодня