Вложенные ключи пространства имен в HugSQL Query
У меня есть вложенная карта с такими ключами в пространстве имен:
{
:model.person/primary {:model.person/name "John Smith"}
}
Вместо того, чтобы упрощать это до плоской карты, я бы хотел передать это прямо в функцию HugSQL. В документах говорится, что HugSQL поддерживает получение глубоких параметров и ключи с пространством имен, но я не уверен, как их объединить.
(hugsql/def-sqlvec-fns-from-string
"-- :name get_person :? :1
-- :doc Get a person
SELECT * FROM person WHERE name = :value:model.person/primary:model.person/name")
Теперь, если я выполняю функцию, которую он генерирует с моей исходной картой, я получаю следующее:
(get_person-sqlvec {:model.person/primary {:model.person/name "John Smith"}})
Execution error (ExceptionInfo) at hugsql.core/validate-parameters! (core.clj:83).
Parameter Mismatch: :model.person/name parameter data not found.
Я бы предположил, что соглашение об именах переменных в SQL является источником проблемы:
:value:model.person/primary:model.person/name
Но я не уверен, какое значение должно быть правильным.
1 ответ
Во-первых, глубокий параметр использует .
между клавишами, а не :
, так что это часть вашей проблемы.
Однако прямо сейчас HugSQL поддерживает только один уровень квалифицированных ключевых слов - потому что существует неотъемлемая двусмысленность между .
для разделения глубоких параметров получить ключи и .
которые могут быть частью (квалифицированных) ключевых слов.
Вы могли бы иметь where name = :value:model.person/primary.name
а затем хеш-карту вроде {:model.person/primary {:name "John Smith"}}
Или вы могли бы where name = :value:model.person/name
и пройти {:model.person/name "John Smith"}
HugSQL потребуется другой синтаксис для поддержки вложенных квалифицированных ключей (чтобы разрешить .
двусмысленность). Я упомянул подход Селмера к Кертису Саммерсу, сопровождающему HugSQL: использование..
чтобы указать точку, которая является частью ключевого слова, чтобы вы могли:
where name = :value:model..person/primary.model..person/name
(именно так Селмер указывает вложенные квалифицированные ключи), но есть проблемы с обратной совместимостью, которые следует учитывать, а также то, является ли это хорошим синтаксисом в первую очередь (я активный пользователь Селмера, и мне это не нравится, но я понимаю, почему они сделали это).