Это вопрос, который является самым идиоматическим вопросом в Clojure.clojure-variable-names для database_column_names
Я использую Cassandra для своей БД, с Алией, поскольку мой водитель Clojure (как Кассандра, так и Алия работают феноменально хорошо - не может быть счастливее).
Проблема заключается в следующем: Cassandra использует символы подчеркивания (не тире) в именах столбцов, а Clojure предпочитает тире подчеркивания. Таким образом, «пользовательский ключ» в Clojure является «user_key» в Cassandra. Как лучше всего обращаться с отображением имен столбцов Cassandra на переменные Clojure?
Поскольку я использую подготовленные операторы для своих запросов CQL, я думаю, что тот факт, что имена столбцов содержат символы подчеркивания, а не тире, - это больше, чем детализация реализации, которые нужно абстрагировать - я часто ставил запросы CQL как строки в мой код Clojure, и я думаю, что важно представлять CQL так, как есть на самом деле. Я рассмотрел подходы, которые автоматически изменяют тире, чтобы подчеркнуть строки запроса, так что есть Clojure-версия CQL, которая отображается в Cassandra-версии CQL, но это кажется неприемлемым уровнем абстракции. Кроме того, вам нужно будет использовать символы подчеркивания, когда вы запускаете запросы CQL непосредственно в Cassandra для устранения неполадок, поэтому вам нужно сохранить два разных представления имен столбцов в вашей голове. Похоже на неправильный подход.
подхода я кончался взятие должно выполнить отображение в деструктурирующей карте Clojure, как это:
(let [{user-key :user_key, user-name :user_name}
(conn/exec-1-row-ps "select user_key,user_name from users limit 1")])
(«Конны/Exec-1-рядного пса» моя функция удобства, что просто просматривает строку CQL на карте и использует предварительно подготовленный оператор, если он присутствует, или же готовит оператор и заносит его на карту, а затем выполняет подготовленный оператор и возвращает первую строку набора результатов или бросает исключение, если возвращается более одной строки).
, если я использую более кратким {: клавиши []} метод деструктурирующие, то я застрял с подчеркиванием в моих имен переменных Clojure:
(let [{:keys [user_key user_name]} ...
Это был первый подход, который я попробовал, но становится уродливым очень быстро, поскольку переменные имена с подчеркиваниями просачиваются через код и идут голова к голове с тире с тире. Смешение.
Столкнувшись с этой проблемой в течение длительного времени, делая преобразование на карте деструктурирования, где Clojure «имя переменной» и Cassandra «column_name» являются бок о бок, похоже на лучшее решение. Это также позволяет мне расширять short_col_nms до более описательных переменных-имен, когда захочу.
Это имеет некоторое сходство с отображением, которое Clojure делает с подчеркиваниями в именах файлов, в тире в пространствах имен, поэтому кажется, что существует некоторый прецедент для выполнения такого сопоставления. В случае имени файла/пространства имен Clojure автоматически выполняет сопоставление, и поэтому, возможно, прямым аналогом будет версия {: keys []} деструктурирования, которая отображает тире, чтобы подчеркнуть.
Я относительный новичок в Clojure, поэтому я понимаю, что могут быть лучшие способы сделать это. Отсюда мой вопрос.
Одним из улучшений, которые я рассмотрел, является создание макроса, который динамически создает карту деструктурирования во время компиляции. Но я не знаю, как написать макрос, который работает в начале процесса компиляции.
Если вопрос был, как преобразовать ключи карты результатов Cassandra из подчеркиваний в тире, я бы сделал это следующим образом: '(defn underscore-to-dash-string-keys [m] (в {} (для [[kv] m] [(clojure.string/replace k \ _ \ -) v]))) '.но вопрос в том, каков идиоматический способ обработки имен столбцов с подчеркиванием? Если ваш ответ «просто преобразуйте символы подчеркивания в тире», то, как я сказал выше, я думаю, что это слишком мало скрывает реализацию Cassandra. –
Мое решение также будет обертывать вложенные структуры данных cassandra (но на самом деле я не знаю, может ли это быть реальным случаем). – tangrammer
и на самом деле вы получаете ключи ключей от Cassandra, поэтому мое решение должно быть: '(defn underscore-to-dash-string-keys [m] (в {} (для [[kv] m] [ (-> k name (clojure.string/replace \ _ \ -) keyword) v]))) ' –