2012-05-16 1 views
3

Создаю таблицу, имя которой не совпадает с ее именем записи. Ниже приведен фрагмент кода Выход исключения Mnesia: {aborted, {bad_type, Record}}

 
%% ---- record definition -------------------------------- 
-record(object,{key,value}).
%% ---- create table ------------------------------------- {atomic,ok} = mnesia:create_table(mytable,[ {type,set}, {frag_properties,[ {node_pool,[node()]}, {n_fragments,4}, {n_disc_copies,1}]}, {attributes,record_info(fields,object)}] ),

%% ------- inserting --------------------------------
insert()-> F = fun() -> R = #object{ key = "MyKey", value = "Value" }, mnesia:write(mytable,R,write) end, mnesia:activity(transaction,F,[],mnesia_frag).
При этом mnesia кричит громко с исполнением. Таблица создана очень хорошо и может быть просмотрена в tv:start(). или в mnesia:info().. Это ошибка, которую я вижу в своей оболочке.
 
** exception exit: {aborted, 
         {bad_type, 
          #object{ 
           key = "MyKey", 
           value = "Value"}}} 
    in function mnesia:wrap_trans/6 (mnesia.erl, line 395) 
Теперь, как правило, я думал, что получится такая ошибка, когда определение записи, используемое при создании таблицы, отличается от структуры записи, вставленной в таблицу. Интересно, это просто проблема с функцией, которую я использую, то есть: mnesia:write/3, которая помогает, когда имя таблицы отличается от имени записи.

Я попытался удалить схему и создать ее заново, но все напрасно. Когда я не использую mnesia:write/3, запись будет правильно вставлена ​​в таблицу. Но мои потребности приложения таковы, что у меня будет несколько разных таблиц, которые создаются, но они сохраняют одну и ту же структуру/определение записи. Я хочу иметь разные таблицы, но их определение record_info - это то же самое.

Где-то в документах я читал, что это очень возможно. Я бегу: Erlang otp R15B, mnesia-4.6 , windows 7 enterprise, 32-bit operating system, Dell laptop, intel core i5, 4GB RAM Все остальные проекты erlang, над которыми я работаю, в порядке, у них нет никакого странного/неожиданного поведения, подобного этому.
Любые предложения?

ответ

8

При создании таблицы вы должны использовать свойство {record_name, object}. например

{atomic,ok} = mnesia:create_table(mytable,[ 
       {type,set}, 
       {frag_properties,[ 
          {node_pool,[node()]}, 
          {n_fragments,4}, 
          {n_disc_copies,1}]}, 
       {record_name, object}, 
       {attributes,record_info(fields,object)}] 
      ), 

docs С:

{имя_записи, Имя}, где имя должно быть атомом. Все записи, хранящиеся в таблице, должны иметь это имя как первый элемент. По умолчанию используется то же имя, что и имя таблицы.

+0

+1 проголосовало! это фантастично. Спасибо @Isac –

Смежные вопросы