3

MNesiaの動的クエリを生成する関数を実装しようとしています。

たとえば、これらの引数を使用して関数が呼び出された場合。

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

MNesiaにクエリを実行して、名前「jack」年齢21歳の個人テーブルのアイテムを一覧表示したいと思います。

qlc:q(ListComprehension)とqlc:string_to_handle( "ListComprehension")を使用してこれを実装しようとしました。コンパイルエラーが原因で最初に失敗しましたが、コンパイラでは、ListComprehentionsの代わりに関数を使用できず、「Item#Table.Field」のようなレコード名の代わりに変数を使用できませんでした。2番目は失敗しました。これは、erl_evalがレコードを処理できず、{undefined_record、person}などの例外をスローしたためです。

どの方法を使用すればよいですか?どうすればこれらの問題を解決できますか?または、別の方法を使用する必要がありますか?

ありがとう。

4

2 に答える 2

1

「exprecs」を試してみてください。それらはここで説明されています:

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

説明から読む:

トランスフォームは、モジュール間にコンパイル時の依存関係を導入することなく、レコードをインスタンス化、検査、および変更するためのアクセサー関数を追加します。

そのページに例が示されています。これが役立つかどうかを確認してください。

于 2010-06-13T16:54:24.677 に答える
1

mnesia:select/1がテーブルに対するクエリに使用する一致仕様を確認してください。テーブルの列名(および列インデックス)を見つけるためのmnesia:table_info/2があります。

マッチスペックは、マッチスペックに関するERTSユーザーガイドに記載されています。私は通常、コンパイル時にerlangに見える楽しい構文からmatchspecを作成できる便利な解析変換であるets:fun2ms/1を使用することに頼っています。シェルから直接試してみることができます。

于 2010-06-11T13:56:48.000 に答える