2017-02-13 38 views
1

我有一個爲elixir項目定義的mnesia表。我如何獲得:mnesia.select在elixir中工作?

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來獲得這個簡單的查詢,以便我可以在此基礎上開發一些更復雜的查詢。任何援助將不勝感激。

回答

1

我對mnesia只有粗略的經驗,但它看起來像MatchHead應該是一個結構/記錄(而不是原子命名錶,如在你的例子中)。請參閱mnesia getting started文檔中的「使用Mnesia函數」。

所以,你的選擇或許應該是這樣的:

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

這也解釋了{:badarg, [:todo_lists, [{{:todo_lists, :"$1", :"$2"} ...錯誤,WRT的第二次出現:todo_lists。

+0

是的,表名是不幸的。而且你的建議對於Erlang應用程序來說可以,但這是Elixir,我使用位置參數而不是記錄。但是爲了顯示我在上面使用的表名和基本語法,我在一個新的iex會話中構造了一個簡單的:todo_lists表。這很好 - ':mnesia.select(:todo_lists,[{{:todo_lists,:「$ 1」,:「$ 2」},[{:==,:「$ 1」,20170201}],[:「$ $「]}]){:atomic,[[20170201,」another task「]]}',這讓我懷疑原始示例的雙元關鍵字可能是這裏的問題。 – wnorman

相關問題