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來獲得這個簡單的查詢,以便我可以在此基礎上開發一些更復雜的查詢。任何援助將不勝感激。
是的,表名是不幸的。而且你的建議對於Erlang應用程序來說可以,但這是Elixir,我使用位置參數而不是記錄。但是爲了顯示我在上面使用的表名和基本語法,我在一個新的iex會話中構造了一個簡單的:todo_lists表。這很好 - ':mnesia.select(:todo_lists,[{{:todo_lists,:「$ 1」,:「$ 2」},[{:==,:「$ 1」,20170201}],[:「$ $「]}]){:atomic,[[20170201,」another task「]]}',這讓我懷疑原始示例的雙元關鍵字可能是這裏的問題。 – wnorman