Datomic中使用db.type/tuple类型无法创建实体的问题排查
Datomic tuple类型写入报错解决方案
错误根因
你当前的schema配置组合如下:
- 值类型为
:db.type/tuple,通过:db/tupleType指定tuple的所有元素为字符串类型(同质tuple) - 基数为
:db.cardinality/many,代表该属性可存储多个独立的tuple值,而非存储一个包含多个字符串的tuple
你写入时直接将["Error-code" "sample error message"]赋值给:df/Errors,Datomic会将向量内的两个字符串判定为该many属性的两个独立值,每个字符串都需要符合tuple类型要求,因此触发Invalid tuple value报错。
解决方案
根据你的实际需求选择对应修改方案:
方案1:保留many基数(单条实体可存储多个错误tuple)
写入时将每个tuple作为外层向量的独立元素,正确写法如下:
(d/transact conn {:tx-data [{ :df/Errors [["Error-code" "sample error message"]]}]})
需要新增多个错误时,直接在外层向量追加tuple即可:
(d/transact conn {:tx-data [{ :df/Errors [["Error-code" "sample error message"] ["Error-code-2" "another error message"]]}]})
方案2:修改为one基数(单条实体仅存储一个错误tuple)
先修正schema的基数配置:
(d/transact conn { :tx-data [{ :db/ident :df/Errors :db/valueType :db.type/tuple :db/tupleType :db.type/string :db/cardinality :db.cardinality/one}]})
你原来的写入代码即可正常执行:
(d/transact conn {:tx-data [{ :df/Errors ["Error-code" "sample error message"]}]})
内容的提问来源于stack exchange,提问作者VikasR
相关产品推荐
相关产品推荐

