没有案例子句的QLC查询中的Mnesia错误case_clause

亚历克斯·波波夫(Alex Popov)

对于hacky项目,我具有以下功能:

% The Record variable is some known record with an associated table.
Query = qlc:q([Existing ||
  Existing <- mnesia:table(Table),
  ExistingFields = record_to_fields(Existing),
  RecordFields = record_to_fields(Record),
  ExistingFields == RecordFields
]).

该函数record_to_fields/1只是从元组中删除记录名称和ID,以便我可以比较字段本身。如果有人想要上下文,那是因为我在尝试将其插入Mnesia之前为记录预先生成了唯一的ID,并且我想确保不存在具有相同字段(但ID不同)的记录。

这导致以下(为清晰起见,已编辑)堆栈跟踪:

{aborted, {{case_clause, {stuff}},
      [{db, '-my_func/2-fun-1-',8, ...

指向我声明的行Query,但是看不到case子句。是什么导致此错误?

(会回答自己,但我很感谢您的评论可以解释我如何实现自己想要的目标)

编辑:如果我可以简单地将某些字段标记为唯一,并且Mnesia具有专用insert/1create/1功能,则这不是必需的

富人

对于您的示例,我认为您的解决方案无论如何都是更清晰的(尽管您似乎可以将其拉到record_to_fields(Record)理解范围之外,这样就不会一遍又一遍地进行计算了。)

是的,列表推导只能包含生成器和赋值。但是您可以通过编写一个作为一个元素生成器的作业来作弊。例如,您可以这样重写表达式:

RecordFields = record_to_fields(Record),
Query = qlc:q([Existing ||
  Existing <- mnesia:table(Table),
  ExistingFields <- [record_to_fields(Existing)],
  ExistingFields == RecordFields
]).

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章