【问题标题】:How to implement dynamic queries for MNesia?如何实现 MNesia 的动态查询?
【发布时间】:2011-03-02 13:55:09
【问题描述】:

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

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

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

我想查询 MNesia 以 列出 name"jack"age 的项目>21person 表中。

我尝试通过使用 qlc:q(ListComprehension) 和 qlc:string_to_handle("ListComprehension") 来实现这一点。由于编译错误,第一次失败,编译器不允许我使用函数而不是 ListComprehentions 和变量而不是像“Item#Table.Field”这样的记录名称。第二次失败,因为 erl_eval 无法处理记录并抛出了 {undefined_record, person} 等异常。

我应该使用哪种方法?我该如何解决这些问题?还是应该使用其他方法?

谢谢。

【问题讨论】:

  • 记录是编译时构造,您不能在运行时动态使用。基本上在编译时所有的记录都被转换成看起来像 {person, "jack", 21} 的元组。由此,运行时无法确定您在说 Item#Table.Field 时所要求的内容。有关记录的更多详细信息,请参阅erlang.org/doc/reference_manual/records.html

标签: erlang mnesia


【解决方案1】:

查看mnesia:select/1 用于查询表的匹配规范。有mnesia:table_info/2 用于查找表的列名(和列索引)。

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

【讨论】:

    【解决方案2】:

    你可以试试“exprecs”。它们在这里解释:

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

    阅读描述:

    转换添加了访问器函数 用于实例化、检查和 修改记录,无需 引入编译时依赖 模块之间。

    该页面中提供了示例。看看这是否有帮助。

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 2017-12-10
      • 2012-06-08
      • 2021-09-20
      • 2015-04-15
      • 2020-06-26
      相关资源
      最近更新 更多