Erlang 如何获得:mnesia.select在elixir工作?

Erlang 如何获得:mnesia.select在elixir工作?,erlang,elixir,mnesia,Erlang,Elixir,Mnesia,我有一个定义用于elixir项目的mnesia表 iex 1> :mnesia.create_table(:todo_lists, [attributes: [:name, :list], disc_only_copies: nodes]) iex 4> :mnesia.transaction(fn -> ... 4> :mnesia.match_object({:todo_lists, :_, :_}) ... 4> end) {:atomic, [{:tod

我有一个定义用于elixir项目的mnesia表

iex 1> :mnesia.create_table(:todo_lists, [attributes: [:name, :list], disc_only_copies: nodes])

iex 4> :mnesia.transaction(fn ->
... 4> :mnesia.match_object({:todo_lists, :_, :_})
... 4> end)
{:atomic,
 [{:todo_lists, {"normans_list", {2017, 2, 11}},
   [%{date: {2017, 2, 11}, title: "job interview"},
    %{date: {2017, 2, 11}, title: "market"}]},
  {:todo_lists, {"obamas_list", {2017, 2, 11}},
   [%{date: {2017, 2, 11}, title: "vacation"},
    %{date: {2017, 2, 11}, title: "coding session"}]},
  {:todo_lists, {"alices_list", {2017, 2, 14}},
   [%{date: {2017, 2, 14}, title: "yoga class"}]},
  {:todo_lists, {"bills_list", {2017, 2, 11}},
   [%{date: {2017, 2, 11}, title: "business meeting"}]},
  {:todo_lists, {"bills_list", {2017, 2, 14}},
   [%{date: {2017, 2, 14}, title: "band practice"}]}]}
从上面的列表中可以看到,表元素由一个两元组键和一个映射列表组成

类似这样的匹配查询工作正常:

iex 13> :mnesia.transaction(fn ->
... 13> :mnesia.match_object({:todo_lists, {"bills_list", :_}, :_})
... 13> end)

{:atomic,
 [{:todo_lists, {"bills_list", {2017, 2, 11}},
   [%{date: {2017, 2, 11}, title: "business meeting"}]},
  {:todo_lists, {"bills_list", {2017, 2, 14}},
   [%{date: {2017, 2, 14}, title: "band practice"}]}]}
但当我尝试类似的方法时,我看到了badarg错误:

iex 14> :mnesia.transaction(fn ->                                                              
... 14> :mnesia.select(:todo_lists, [{{:todo_lists, :"$1", :"$2"},[{:==, :"$1", {"bills_list", {2017, 2, 14}}}], [:"$$"]}])
... 14> end)
{:aborted,
 {:badarg,
  [:todo_lists,
   [{{:todo_lists, :"$1", :"$2"}, [{:==, :"$1", {"bills_list", {2017,2,14}}}], [:"$$"]}]]}}
似乎guard子句中对元组键的引用会导致一个badarg-例如,我可以使用无意义的[{:>,:$1,0}]-得到结果,但我只是看不出这里有什么错


我想使用:mnesia.select/2来实现这个简单的查询,以便在此基础上开发一些更复杂的查询。非常感谢您的帮助。

我对mnesia只有粗略的经验,但它看起来应该是一个结构/记录,而不是一个命名表的atom,如您的示例所示。请参阅文档中的使用记忆功能

因此,您的选择可能如下所示:

:mnesia.select(:todo_lists, [{%YourStructHere{ ..WhateverMatch..}, Guard, Result}])

这解释了{:badarg,[:todo_列表,[{{{:todo_列表,:$1,:$2}…错误,请注意:todo_列表的第二次出现。

是的,表名很不幸。您的建议对于Erlang应用程序来说也不错,但这是Elixir,我使用的是位置参数而不是记录。但是为了显示我上面使用的表名和基本语法,我在新的iex会话中构造了一个简单的:todo_列表表n、 这很好-`:mnesia.select:todo_列表,[{{:todo_列表,:$1,:$2},[{:==,:$120170201}],:$$]}]{:atomic,[[20170201,另一个任务]]}`,这让我怀疑我的原始示例的两元组键可能是这里的问题。