3

Mnesia で以下のスキーマを作成したいと考えています。t1、t2、および t3 と呼ばれる 3 つのテーブルがあり、それぞれに次のレコードの要素が格納されます。

-record(pe, {pid, event}).

私はテーブルを作成しようとしました:

Attrs = record_info(fields, pe),
Tbls = [t1, t2, t3],
[mnesia:create_table(Tbl, [{attributes, Attrs}]) || Tbl <- Tbls],

次に、次の行を使用してコンテンツを書き込みます (P と E には値があります)。

mnesia:write(t1, #pe{pid=P, event=E}, write)

しかし、私は悪い型エラーを受け取りました。(関連するコマンドはトランザクションに渡されたので、同期の問題ではありません。)

Mnesia の教科書の例はすべて、異なるレコードに対して異なるテーブルを作成する方法を示しています。誰かが同じレコードに対して異なるテーブルを作成する例で返信できますか?

4

1 に答える 1

1

テーブルを作成するための「DDT」に関しては、一目見ただけでは何の問題もありません。レコード名とは異なる名前のテーブルを使用すると、「単純な」コマンド (mnesia:write/1 など) が失われることを覚えておいてください。 element(1, RecordTuple) を使用してテーブル名を取得します。

テーブルを定義するとき、オプション {record_name, RecordName} (あなたの場合: {record_name, pe}) を使用して、テーブル内のレコードを表すタプルの最初のアトムがテーブル名ではなく、record_name で渡したアトムであることを mnesia に伝えることができます。 ; したがって、テーブル t1 の場合、レコードを挿入または検索するときに mnesia が 'pe' レコードを期待するようになります。

すべてのテーブルにレコードを挿入する場合は、テーブルの作成に使用したものと同様のスクリプトを使用できます (ただし、mnesia トランザクション コンテキストの関数ラッパーで)。

insert_record_in_all_tables(Pid, Event, Tables) ->
    mnesia:transaction(fun() -> [mnesia:write(T, #pe{pid=Pid, event=Event}, write) ||  T <- Tables] end).

お役に立てれば!

于 2011-07-25T10:05:28.790 に答える