3

我正在尝试实现一个为 MNesia 生成动态查询的函数。

例如,当使用这些参数调用函数时;

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

我想查询 MNesia 以在person表中列出名称“jack”年龄21的项目。

我尝试通过使用 qlc:q(ListComprehension) 和 qlc:string_to_handle("ListComprehension") 来实现这一点。由于编译错误,第一次失败,编译器不允许我使用函数而不是 ListComprehentions 和变量而不是像“Item#Table.Field”这样的记录名称。第二次失败,因为 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用于查找表的列名(和列索引)。

Matchspecs 记录在ERTS user guide on match specification中。我通常使用ets:fun2ms/1,这是一种方便的解析转换,可以在编译时从看起来很有趣的语法创建匹配规范。您可以直接从 shell 中使用它。

于 2010-06-11T13:56:48.000 回答