HoneySQL не может работать с составным ключом в предложении WHERE? - PullRequest
0 голосов
/ 19 февраля 2019

Я не могу заставить HoneySQL испускать SQL, который позволяет мне использовать составной ключ в предложении WHERE.

Что я пытаюсь получить: SQL:

SELECT field_id, layer, event_date, is_deleted
FROM event
WHERE 
  field_id in ('1325629', '1627236', '1673576') AND
  layer in ('fha.raw') AND
  (field_id,layer,event_date) > ('1627236','fha.raw', '2018-07-23 09:45:07.6-07')
ORDER BY field_id, layer, event_date;

HoneySQL:

(-> (sqlh/select :field_id :layer :event_date :is_deleted)
    (sqlh/from :event)
    (sqlh/merge-where [:in :field_id field-ids])
    (sqlh/merge-where (cond (not-empty layers) [:in :layer layers]))
    (sqlh/merge-where [:> 
                       [:field_id :layer :event_date] 
                       ["1627236" "fha.raw" (c/from-string "2018-07-23T09:45:07.6-07:00")]])
    (sqlh/order-by :field_id :layer :event_date)
    sql/format)

HoneySQL производит что-то, что не может работать

["SELECT field_id, layer, event_date, is_deleted FROM event WHERE (((field_id in (?, ?, ?)) AND (layer in (?, ?, ?, ?))) AND field_id(layer, event_date) > 1627236(?, ?)) ORDER BY field_id, layer, event_date"
 "1325629"
 "1627236"
 "1673576"
 "fha.abs"
 "fha.rank"
 "fha.true-color"
 "fha.raw"
 "fha.raw"
 #object[org.joda.time.DateTime 0x4fa79ee8 "2018-07-23T16:45:07.600Z"]]


... он изобил мой составной ключ в предложении WHERE, ошибочно создавая вызов функции или что-то в этом роде: field_id(layer, event_date) вместо (field_id, layer, event_date)

Как мне сделать эту работу?

Это связано с вопросом, который я задал ранее, когда пытался сделать то же самое в предложении ORDER BY( Как сделать так, чтобы HoneySQL обрабатывал заказ как составной ключ? ).Оказывается, что никогда не было решено с точки зрения составного ключа, но я позволил мне сортировать DESC по одному из полей.Другими словами, мне еще предстоит найти, как заставить HoneySQL создать составной ключ в предложениях WHERE или ORDER BY.

Я мог бы использовать небольшое направление.

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Возможно, вы захотите рассмотреть Walkable, другую библиотеку SQL с более выразительным языком https://walkable.gitlab.io/s-expressions.html

Например, ваш запрос переведен на Walkable:

(let [field-ids     [1 2 3]
      layers        ["a" "b" "c"]
      layer-filters (when (not-empty layers) `([:in :layer ~@layers]))]
  `[(:event/all {:filters  [:and [:in :event/field-id ~@field-ids]
                            ~@layer-filters
                            [:> [:tuple :event/field-id :event/layer :event/event-date]
                             [:tuple "1627236" "fha.raw" "2018-07-23T09:45:07.6-07:00"]]]
                 :order-by [:event/field-id :event/layer :event/event-date]}
                [:event/field-id :event/layer :event/event-date :event/is-deleted])])
0 голосов
/ 01 марта 2019

Как и большинство абстракций SQL, HoneySQL работает только для стандартных случаев.Я считаю, что это хороший момент, чтобы использовать выражение raw.Он вставляет оператор SQL как есть без предварительной обработки, либо с помощью функции или тега:

(sql/raw "@var := foo.bar")
#sql/raw "@var := foo.bar"

В вашем случае это будет просто:

...
(sqlh/merge-where
  #sql/raw "(field_id,layer,event_date) > ('1627236','fha.raw', '2018-07-23 09:45:07.6-07')")
...

, и выхорошо.

Конечно, никогда не передавайте ввод пользователя в необработанный оператор SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...