Pull to refresh

Comments 13

Было бы гораздо проще оценить DSL, если бы к нему были даны пояснения ;) А так получается какой-то сферический DSL для описания какой-то базы данных в вакууме.
А по-моему, все просто и понятно. И код красиво расцвечен. Описания таблиц — есть. Составление запроса на DSL — есть (там где :join, :where).

Нет только того, как по этому внутреннему языку генерируется SQL, — если он вообще тут генерируется, и если я правильно понимаю логику работы с этой ORM.
Во-первых, да, непонятно, как это транслируется на SQL (а скорее на функции из clojure.java.jdbc).
Во-вторых, нет никакой информации о предметной области. Например, я только в середине статьи понял, что речь идёт о какой-то игре, в которой могут принимать участие человек и бот. Что за игра — ни одного намёка.
В-третьих, записи типа :join [[table-recordtypes [:= recordtypes-id records-type_id]]] ни разу не самоописательные. Ок, я догадался, что := — это такое равенство. Но почему вектор в векторе? Я, конечно, догадываюсь, что из-за синтаксиса JOIN, но где описание?
В-четвёртых, нет описания ни общих принципов, ни отдельных функций (что такое select-deep? какие ещё есть типы select-ов)?

Я понимаю, что суть статьи в том, чтобы показать возможную замену ORM. Но как их сравнить, если во всей статье всего пара реальных вызовов API, да и те не описаны.
Да, в select-e sql полностью генерируется и скармливается соответствующей функции из clojure.java.jdbc. Вообще, для всех функций backend-ом является она.

К сожалению, никакой предметной области нет. Таблицы и их минимальное содержание были придуманы только для примера.

Записи типа :join это ключевые параметры функции select (мы решили не использовать where, join и пр. в виде отдельных функций). Вектор в векторе из-за того, что в join-е могут участвовать несколько таблиц, где описание «соединения» каждой представлено в виде вектора [таблица [условия_связи]]. В данном случае в векторе описание только одной таблицы.

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

(select (table :users) (where (= :id 5)))

(join (table :one) (table :two) :id) (join (table :one) (table :two) (where (= :one.col :two.col)))
Я вас услышал. Для ваших претензий, действительно, есть объективные причины. Мне это было непонятно, потому что с языком я дел не имел, и мне все показалось красивым.

Единственное, с чем я не согласен — что не описана предметная область. Тут она, в общем-то, и не важна.
DSL ничем не лучше, чем ClojureQL и подобные библиотеки.
Нам нужен был язык запросов, работающий именно с нашими генерируемыми данными (таблицы, поля). Также хотелось, чтобы было реализовано одно из наших требований: получение данных из связанных по внешним ключам таблиц (в orm-е джавы это было очень удобно).
Спасибо. Очень хотел, чтобы человек, сильно не знакомый с самим языком, почувствовал удобство как самой библиотеки, так и возможностей clojure.
Я, наоборот, боялся, что получается много букв для вводной статьи, поэтому описание всех функций не привел. Сегодня постараюсь добавить.
Как вы быстро от вечаете на посты почти годичной давности?
Сработало настроенное уведомление.
Sign up to leave a comment.

Articles