Сопоставить все пары ключ / вал
Исходный запрос:
-- :name select*-list
-- :command :query
-- :result :raw
-- :doc Select all lists.
-- parameters()
SELECT * FROM list;
Я хочу передать произвольные пары ключ /val и получить соответствующие результаты. Например:
(select*-list db-spec {:name "Fruit" :type "Foo"})
должно привести к:
SELECT * FROM list
WHERE name = 'Fruit'
AND type = 'Foo';
Я могу придумать несколько уродливых способов сделать это, но, скорее всего, я упускаю из виду хороший способ сделать это.
2 ответа
У JDBC есть несколько отличных ярлыков из коробки. Одним из них является поиск по ключам. Он делает именно то, что вы хотите: берет карту пар ключ / значение и составляет набор WHERE
пункты, связанные с AND
:
(jdbc/find-by-keys db-spec :users {:name "John" :age 42 :city "Chita"})
окажется
select from users
where
name = 'John'
and age = 42
and city = 'Chita';
Вот пример java-jdbc.sql
(require '[java-jdbc.sql :as sql])
(jdbc/query db-spec
(sql/select * :fruit (sql/where {:appearance "ripe"})))
;; -> ({:grade 8.4, :unit "carton", :cost 12, :appearance "ripe", :name "Plum"})
Посмотри пожалуйста:
- Кулинарная книга Clojure (я рекомендую купить печатную копию).
- Страницы JDBC по адресу clojure-doc.org