全部博文(921)
分类: Python/Ruby
2012-09-23 17:44:02
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:
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.
Compiling and running
If you wanted sorted output then use the following version of the QH = ... line above
If you wanted to select distinct values, the following would work:
Again, the code is just to illustrate an approach
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.
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
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.
Pour trier d'une manière efficace, qlc fournit qlc:sort.
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.