Вложенные ключи пространства имен в 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

(именно так Селмер указывает вложенные квалифицированные ключи), но есть проблемы с обратной совместимостью, которые следует учитывать, а также то, является ли это хорошим синтаксисом в первую очередь (я активный пользователь Селмера, и мне это не нравится, но я понимаю, почему они сделали это).

Другие вопросы по тегам