Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5120153
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2012-09-23 17:44:02

1.Erlang有一个类似SQL的数据检索机制,叫做QLC(Query Interface to Mnesia, ETS, Dets, etc),可用于对Mnesia、ETS/DETS的数据表进行数据检索,包括常见的按指定域排序(ORDER BY)、按条件筛选(WHERE...)以及限制返回的结果长度(COUNT)。看个简单的例子:


  1. -module(test).
  2. -export([start/0]).
  3. -include_lib("stdlib/include/qlc.hrl").
  4. start() ->
  5.     QH1 = qlc:q([{X, Y} || X <- [8,3,6,2], Y <- [b,a,c]]),
  6.     %以第一个值作为key进行排序
  7.     QH2 = qlc:keysort(1, QH1, [{order, ascending}]),
  8.     QC = qlc:cursor(QH2),
  9.     %获取前两条记录
  10.     qlc:next_answers(QC, 2),
  11.     %获取剩余的其他记录
  12.     qlc:next_answers(QC, all_remainning).
2。再看一个国外网站上的案例:
 
Use QLC's {unique, true} option (See QLC documentation for more info).

I created a mnesia table, called test, with bag semantics. Each row consists of the table name, a Key and a Value, so my rows looked like:

  1. 1. test, 1, 1
  2. 2. test, 2, 1
  3. 3. test, 2, 2
  4. 4. test, 3, 1
  5. 5. test, 3, 2
  6. 6. test, 3, 3
  7. ... etc.

Then this simple module illustrates my approach. Notice that you have to include the qlc library and that, in my example, I am selecting distinct Keys.


 

  1. -module(test).
  2. -export([select_distinct/0]).

  3. -include_lib("stdlib/include/qlc.hrl").

  4. select_distinct()->
  5.     QH = qlc:q( [K || {_TName, K, _V} <- mnesia:table(test)], {unique, true}),
  6.     F = fun() -> qlc:eval(QH) end,
  7.     {atomic, Result} = mnesia:transaction(F),
  8.     Result.

Compiling and running

  1. > c("/home/jim/test", [{outdir, "/home/jim/"}]).
  2. > test:select_distinct().
  3. > [4,1,2,3,5]

If you wanted sorted output then use the following version of the QH = ... line above

  1. QH = qlc:sort(qlc:q( [K || {_TName, K, _V} <- mnesia:table(test)], {unique, true})),

If you wanted to select distinct values, the following would work:

  1. QH = qlc:sort(qlc:q( [V || {_TName, _K, V} <- mnesia:table(test)], {unique, true})),

Again, the code is just to illustrate an approach

 
来自:
 
 
3.另外一个案例:

It is not always easy to do complicated queries over tables or .

The official syntax to make queries with select/2 is really cryptic.

Here is an example from the official Erlang docs. The query returns the name of each male person aged more then 30.

  1. MatchHead = #person{name='$1', ***=male, age='$2', _='_'},
  2. Guard = {'>', '$2', 30},
  3. Result = '$1',
  4. mnesia:select(Tab,[{MatchHead, [Guard], [Result]}]),

Les critères sont exprimé avec des $. L'ensemble devient assez indigeste pour des cas plus compliqué.

De plus il est impossible de réaliser des opérations basiques dans d'autres moteurs de base de données, comme trier le résultat.

Un module existe pourtant pour améliorer la lisibilité des requêtes. pour Query List Comprehension. Il supporte de base mnesia, ets et dets.

Voici une réécriture de l'exemple précédent

  1. Query = qlc:q([Person#person.name || Person <- mnesia:table(Tab), Person#person.*** == male, Person#person.age > 30]),

Dans ce cas, la requête est exprimé sous la forme d'une list comprehension. Les critères sont exprimé d'une manière intelligible dans la deuxième partie de la list comprehension.

Si vous voulez exécuter cette requête dans mnesia, vous devez le faire dans une transaction.

  1. -include_lib("stdlib/include/qlc.hrl")
  2. Transaction = fun() ->
  3.     Query = qlc:q([Person#person.name || Person <- mnesia:table(Tab), Person#person.*** == male, Person#person.age > 30]),
  4.     qlc:eval(Query)
  5. end,
  6. mnesia:transaction(Transaction),

Pour trier d'une manière efficace, qlc fournit qlc:sort.

  1. -include_lib("stdlib/include/qlc.hrl")
  2. Transaction = fun() ->
  3.     Query = qlc:q([Person#person.name || Person <- mnesia:table(Tab), Person#person.*** == male, Person#person.age > 30]),
  4.     Order = fun(A, B) ->
  5.         B#person.age > A#person.age
  6.     end,
  7.     qlc:eval(qlc:sort(Query, [order, Order]))
  8. end,
  9. mnesia:transaction(Transaction),

Je n'ait pas encore exploré toutes les fonctionnalités de QLC, mais la syntaxe que ce module offre m'a convaincu de l'utiliser le plus possible. La maintenance des requêtes devient beaucoup plus facile.

Une dernière chose, il est possible de créer ses propres modules utilisable avec QLC. Vous pouvez ainsi proposer une syntaxe de recherche sympathique avec un backend totalement différent de ets ou mnesia.




 

阅读(2563) | 评论(0) | 转发(0) |
0

上一篇:mnesia orm

下一篇:mnesia ORM

给主人留下些什么吧!~~