Как реализовать динамические запросы для MNesia? - PullRequest
3 голосов
/ 11 июня 2010

Я пытаюсь реализовать функцию, которая генерирует динамические запросы для MNesia.

Например, когда функция вызывается с этими аргументами;

dyn_query(list, person, [name, age], ["jack", 21])

Я хочу запросить MNesia для список предметов, чье имя равно "jack" и age равно 21 в person Таблица.

Я пытался реализовать это, используя qlc: q (ListComprehension) и qlc: string_to_handle ("ListComprehension").Сначала произошел сбой из-за ошибок компиляции, компилятор не позволил мне использовать функции вместо ListComprehentions и переменные вместо имен записей, таких как "Item # Table.Field".Второй сбой, потому что erl_eval не может обработать записи и выдает исключения, такие как {undefined_record, person}.

Какой метод мне следует использовать?Как я мог решить эти проблемы?Или я должен использовать другой метод?

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 июня 2010

Вы можете попробовать "exprecs".Они объясняются здесь:

http://forum.trapexit.org/viewtopic.php?p=21790

Чтение из описания:

Преобразование добавляет функции доступа для создания, проверки и изменения записей безввести зависимости времени компиляции между модулями.

Примеры приведены на этой странице.Посмотрите, поможет ли это.

1 голос
/ 11 июня 2010

Проверьте спецификации соответствия, которые mnesia: select / 1 использует для запросов к таблице.Существует mnesia: table_info / 2 для нахождения имен столбцов (и индексов столбцов) таблицы.

Спецификации совпадений описаны в Руководство пользователя ERTS по спецификациям совпадений ,Я обычно прибегаю к использованию ets: fun2ms / 1 , который представляет собой удобное преобразование синтаксического анализа, которое может создать соответствие спецификации из забавного синтаксиса, похожего на erlang, во время компиляции.Вы можете поиграть с ним прямо из оболочки.

...