В целом ваш код правильный, но не с оптимальной производительностью. Вы можете использовать один запрос для получения всех пар id-контент. Затем создайте из них одну транзакцию, используя for
. Затем сделайте все сразу.
(let [db @conn
id+content (ds/q '[:find ?id ?content
:where [?id :block/included true]
[?id :block/content ?content]]
db)
tx (for [[id content] id+content]
[:db/add id :block/hiccup (block-content->hiccup db content)])]
(ds/transact! conn tx))
Обратите внимание, что в целом неплохо взять неизменное значение вашей базы данных в какой-то момент времени, а затем выполнять все вычисления на его основе (например, при переходе к block-content->hiccup
функция). Передавайте conn только тогда, когда вам нужна функция для изменения базы данных.
В этом случае она вам не нужна, но в целом, если вам нужно искать атрибуты только для одного объекта, гораздо эффективнее используйте ds/entity
вместо запроса:
(:block/content (d/entity db id))