Вложенные ключи пространства имен в HugSQL Query - PullRequest
0 голосов
/ 01 октября 2019

У меня есть вложенная карта с ключами пространства имен, такими как:

{
  :model.person/primary {:model.person/name "John Smith"}
}

Вместо того, чтобы упростить это в плоской карте, я бы хотел передать ее прямо в функцию HugSQL. В документах говорится, что HugSQL поддерживает глубокие параметры get и ключи пространства имен, но я не уверен, как их объединить.

(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 Ответ

0 голосов
/ 01 октября 2019

Прежде всего, глубокий параметр get использует . между ключами, а не :, так что это является частью вашей проблемы.

Однако сейчас 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 потребуется другой синтаксис для поддержки вложенных квалифицированных ключей (для разрешения неоднозначности .). Я упомянул подход Selmer к Кертису Саммерсу, сопровождающему HugSQL: использовать .. для обозначения точки, являющейся частью ключевого слова, чтобы вы могли получить:

where name = :value:model..person/primary.model..person/name

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

...