模块 QLC
模块描述
Mnesia、ets、dets、etc查询接口
DESCRIPTION
为Mnesia、ets、dets或者其他的数据类型提供一个迭代器遍历的查询接口
qlc模块为【QLC Tables】 实现一个快速查询接口,典型的【QLC Tables】包括ets、dets和mnesia表。它也支持用户定义的表,查看Implementing a QLC table部分。
一个查询开始与【QLCs】,【Qlc Tables】中一个查询的答案取决于QLCs约束
```erlang
1.Erlang有一个类似SQL的数据检索机制,叫做QLC(Query Interface to Mnesia, ETS, Dets, etc),可用于对Mnesia、ETS/DETS的数据表进行数据检索,包括常见的按指定域排序(ORDER BY)、按条件筛选(WHERE...)以及限制返回的结果长度(COUNT)。看个简单的例子:
-module(test).
-export([start/0]).
-include_lib("stdlib/include/qlc.hrl").
start()->
QH1 = qlc:q([{X, Y}|| X <-[8,3,6,2], Y <-[b,a,c]]),
%以第一个值作为key进行排序
QH2 = qlc:keysort(1, QH1,[{order, ascending}]),
QC = qlc:cursor(QH2),
%获取前两条记录
qlc:next_answers(QC, 2),
%获取剩余的其他记录
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. test, 1, 1
2. test, 2, 1
3. test, 2, 2
4. test, 3, 1
5. test, 3, 2
6. test, 3, 3
... 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.
-module(test).
-export([select_distinct/0]).
-include_lib("stdlib/include/qlc.hrl").
select_distinct()->
QH = qlc:q([K ||{_TName, K, _V}<- mnesia:table(test)],{unique, true}),
F = fun()-> qlc:eval(QH)end,
{atomic,Result}= mnesia:transaction(F),
Result.
Compiling and running
> c("/home/jim/test", [{outdir, "/home/jim/"}]).
> test:select_distinct().
> [4,1,2,3,5]
If you wanted sorted output then use the following version of the QH = ... line above
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:
QH = qlc:sort(qlc:q([V ||{_TName, _K, V}<- mnesia:table(test)],{unique, true})),
Again, the code is just to illustrate an approach
来自:
http://stackoverflow.com/questions/8706867/erlang-mnesia-equivalent-to-select-distinct-id-from-table
3.另外一个案例:
It is not always easy to do complicated queries over ETS tables or mnesia.
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. QLC 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.
来自 <http://blog.chinaunix.net/uid-429659-id-3357001.html>
```
- 1.学习
- 1.1安装与运行环境
- 1.2编辑器、集成开发环境与其它工具
- 1.3代码编译运行
- 2.基础
- 2.1 Erlang终端
- 2.2 基础语法
- 2.2.1 异常处理
- 2.3 数据类型
- 2.4 操作符
- 2.5 模块属性
- 3.库函数
- 3.1 常用模块
- 3.2 OTP模块
- 3.2.1 函数
- 3.2.2 receive
- 3.2.3 .app.src文件
- 3.2.4 _app.erl
- 3.2.5 _sup.erl
- 3.2.6 gen_server
- 3.2.7 gen_fsm
- 3.3 erts
- 3.3.1 init
- 3.3.2 BIF
- 3.3.3 NIF
- 3.4 kernel
- 3.4.1 code_server
- 3.4.2 inet
- 3.4.3 net_kernel
- 3.4.4 net_adm
- 3.4.5 error_logger
- 3.4.6 global
- 3.4.7 application
- 3.5 stdlib
- 3.5.2 array
- 3.5.4 base64
- 3.5.5 binary
- 3.5.6 c
- 3.5.8 calendar
- 3.5.9 code
- 3.5.11 dict
- 3.5.12 erl_
- 3.5.13 file
- 3.5.14 filelib
- 3.5.15 gb_trees
- 3.5.16 gb_sets
- 3.5.17 gen_tcp
- 3.5.18 gen_server
- 3.5.19 httpc
- 3.5.20 init_parse
- 3.5.21 init
- 3.5.22 inet
- 3.5.23 io
- 3.5.24 lists
- 3.5.25 maps
- 3.5.26 os
- 3.5.27 ordsets
- 3.5.28 proplists
- 3.5.29 queue
- 3.5.30 qlc
- 3.5.31 re
- 3.5.32 random
- 3.5.33 rfc4627-json
- 3.5.34 string
- 3.5.35 ssh
- 3.5.36 soft
- 3.5.37 sets
- 3.5.38 supervisor
- 3.5.39 tuple
- 3.5.40 timer
- 3.5.41 unicode
- 3.5.42 cpu
- 3.5.43 math
- 3.5.44 zip
- 3.5.45 shell
- 3.6 SASL
- 3.7 asn1
- 3.8 compiler
- 3.9 tools
- 3.10 OS_Mon
- 3.11 crypto
- 3.12 Port
- 4.工具
- 4.1 Erlang预处理器
- 4.2 Erlang节点
- 4.3 Erlang多节点
- 4.3.1主从节点
- 4.4 Epmd
- 4.5 断点工具
- 4.6 dialyzer
- 4.7 dbg-debug 模块
- 4.7.1 dbg
- 4.8 Erlang跟踪工具
- 4.9 etop
- 4.10 profiling
- 4.10.1 fprof
- 4.10.2 eprof
- 4.10.3 cprof
- 5.进阶
- 5.1 TCP粘包、大小端
- 5.2 rebar发布系统
- 5.3 ErlangVM 心跳
- 5.4 Erlang GC
- 5.5 Erlang Time
- 5.6 Erlang 启动
- 5.6.1 SASL配置
- 5.7 Erlang系统限制
- 6.项目
- 6.1 the_seed
- 6.2 network
- 6.3 parse_tool
- 6.4 cache
- 7.项目研究
- 7.1 Mnesia
- 7.1.1 Mnesia模式
- 7.1.2 Mnesia操作
- 7.1.3 Mnesia增删改查
- 7.1.4 Mnesia过载分析
- 7.1.5 Mnesia高级特性
- 7.1.6 分布式
- 7.1.7 Mnesia表分片
- 7.1.8 Mnesia锁
- 7.1.9 dets
- 7.1.10 ets
- 7.2 Ejabberd
- 7.2.1 mod_echo.erl
- 7.2.2 hooks for module developers
- 7.2.3 Events list
- 7.3 cowboy
- 7.4 rebar
- 7.4.1 rebar Wiki
- 7.4.2 rebar.config.script
- 7.5 RIAK CS
- 7.6 Leofs
- 7.6.1 简介
- 8.资料整理
- 8.1 资料
- 8.1.1 Erlang的调度原理
- 8.1.2 虚拟机代码执行原理
- 8.1.3 SMP
- 8.2 杂记
- 8.2.1 设计