5

レコード名と同じ名前ではないテーブルを作成します。以下はコードスニペットです

%%----レコード定義--------------------------------
-record(object、{key、value})。
%%----テーブルの作成------------------------------------- {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)}] )、

%%-------挿入--------------------------------
insert()-> F = fun()-> R = #object { key = "MyKey"、 value="値" }、 mnesia:write(mytable、R、write) 終わり、 mnesia:activity(transaction、F、[]、mnesia_frag)。
これを行うと、mnesiaは大声で叫びます。tv:start().テーブルは非常によく作成されており、でまたはで表示できますmnesia:info().。これは私のシェルで見たエラーです。
**例外終了:{中止、
                       {bad_type、
                           #物体{
                               key = "MyKey"、
                               value ="Value"}}}
     関数mnesia:wrap_trans / 6(mnesia.erl、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プロジェクトは問題なく、このような奇妙な/予期しない動作はありません。
助言がありますか ?

4

1 に答える 1

12

{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)}]
            ),

ドキュメントから:

{record_name、Name}、ここでNameはアトムでなければなりません。テーブルに格納されているすべてのレコードは、最初の要素としてこの名前を持っている必要があります。デフォルトでは、テーブルの名前と同じ名前になります。

于 2012-05-16T16:37:00.367 に答える