Datomic基于UUID字段查询未返回预期结果求助
问题原因
你在查询里直接写uuid1但用引号包裹了查询表达式,导致Datomic把uuid1当作一个未绑定的查询变量,而非你定义的外部UUID变量的值。Datomic的查询语法中,被单引号(')包裹的查询结构里的符号会被当作查询变量,不会引用外部环境的变量。
解决方案
有两种可行的修改方式:
方式一:参数化查询(推荐,符合Datomic最佳实践)
通过:in子句声明查询所需的外部参数,再把uuid1作为参数传递给d/q:
(d/q '[:find ?e :in $ ?target-uuid :where [?e :student/id ?target-uuid]] new-db uuid1)
这里:in $ ?target-uuid表示查询需要接收数据库实例($是默认的数据库参数占位符)和自定义参数?target-uuid,最后把new-db和uuid1依次传入,Datomic会用uuid1的实际值替换?target-uuid执行查询。
方式二:直接使用求值后的查询结构
去掉查询表达式的单引号,让uuid1在查询结构构建时就被求值为实际的UUID值:
(d/q [:find ?e :where [?e :student/id uuid1]] new-db)
这种方式下,uuid1会先被求值为你生成的UUID,再传入查询中,Datomic就能正确匹配到对应的实体。
验证结果
修改后执行查询,就能得到预期的实体ID集合:
;; 示例结果(实体ID会根据实际情况变化) ;; => #{[17592186045418]}
内容的提问来源于stack exchange,提问作者Unsatisfied Zebra
相关产品推荐
相关产品推荐

