Erlang 编程/使用 mnesia
外观
Mnesia 是用 Erlang 编写的分布式数据库,主要用于 Erlang 程序。简单的查询可以使用查询列表推导(qlc)编写。实时查询可以决定不使用事务。
该程序定义了一些类似于 SQL 的函数。我们希望构建一个名为“painting”的艺术品表,包含以下字段:索引、艺术家和标题。
Table: painting +---------------------------------------------+ | index | artist | title | +---------------------------------------------+ | 1 | Dali | The Ghost of Vermeer | | 2 | Dali | The Persistance of Memory | | 3 | Vermeer | Girl With Pearl Earring | +---------------------------------------------+
art:init(). 启动数据库并创建表:painting。
insert() 将数据放入表中
select() 从表中获取数据
请注意,第二次调用 init() 时,数据库将重启,但我们会在尝试重新创建表时收到错误(因为它已经存在)。
-module(art).
-compile(export_all).
-include_lib("stdlib/include/qlc.hrl").
-record(painting, {index, artist, title}).
init() ->
mnesia:create_schema([node()]),
mnesia:start(),
mnesia:create_table(painting,
[ {disc_copies, [node()] },
{attributes,
record_info(fields,painting)} ]).
insert( Index, Artist, Title) ->
Fun = fun() ->
mnesia:write(
#painting{ index=Index,
artist=Artist,
title=Title } )
end,
mnesia:transaction(Fun).
select( Index) ->
Fun =
fun() ->
mnesia:read({painting, Index})
end,
{atomic, [Row]}=mnesia:transaction(Fun),
io:format(" ~p ~p ~n ", [Row#painting.artist, Row#painting.title] ).
select_some( Artist) ->
Fun =
fun() ->
mnesia:match_object({painting, '_', Artist, '_' } )
end,
{atomic, Results} = mnesia:transaction( Fun),
Results.
select_all() ->
mnesia:transaction(
fun() ->
qlc:eval( qlc:q(
[ X || X <- mnesia:table(painting) ]
))
end ).
select_search( Word ) ->
mnesia:transaction(
fun() ->
qlc:eval( qlc:q(
[ {F0,F1,F2,F3} ||
{F0,F1,F2,F3} <-
mnesia:table(painting),
(string:str(F2, Word)>0) or
(string:str(F3, Word)>0)
] ))
end ).
% Sample output:
% 6> c(art).
% {ok,art}
% 7> art:init().
% {atomic,ok}
% 6> art:insert(1,"Dali","The Ghost of Vermeer").
% {atomic,ok}
% 7> art:select(1).
% "Dali" "The Ghost of Vermeer"
% ok
% 8> art:insert(2,"Dali","The Persistence of Memory").
% {atomic,ok}
% 9> art:select(2).
% "Dali" "The Persistence of Memory"
% ok
% 10> art:select(1).
% "Dali" "The Ghost of Vermeer"
% ok
% 25> art:insert(3,"Vermeer", "Girl With Pearl Earring").
% {atomic,ok}
% 26> art:select_some("Dali").
% [{painting,1,"Dali","The Ghost of Vermeer"},
% {painting,2,"Dali","The Persistence of Memory"}]
% 27> art:select_all().
% {atomic,[{painting,1,"Dali","The Ghost of Vermeer"},
% {painting,2,"Dali","The Persistence of Memory"},
% {painting,3,"Vermeer","Girl With Pearl Earring"}]}
%---to run a new session after restarting erlang---
% 2> art:init().
% {aborted,{already_exists,painting}}
% 3> art:select_search("Vermeer").
% {atomic,[{painting,1,"Dali","The Ghost of Vermeer"},
% {painting,3,"Vermeer","Girl With Pearl Earring"}]}