macros - database_column_names 的 clojure-variable-names

标签 macros clojure cassandra destructuring

这是一个“什么是 Clojure 中最惯用的”问题。

我将 Cassandra 用于我的数据库,Alia 作为我的 Clojure 驱动程序(Cassandra 和 Alia 工作得非常好——再高兴不过了)。

问题是这样的:Cassandra 在列名中使用下划线(而不是破折号),而 Clojure 更喜欢破折号而不是下划线。所以 Clojure 中的“user-key”是 Cassandra 中的“user_key”。如何最好地处理 Cassandra 列名到 Clojure 变量的映射?

因为我为我的 CQL 查询使用准备好的语句,我认为列名包含下划线而不是破折号这一事实不仅仅是一个需要抽象的实现细节——我经常将 CQL 查询作为字符串放入我的 Clojure 代码中,我认为按实际情况表示 CQL 很重要。我已经考虑过将查询字符串中的破折号自动转换为下划线的方法,以便有一个 CQL 的 Clojure 版本映射到 CQL 的 Cassandra 版本,但这似乎是一个不合适的抽象级别。此外,当您直接在 Cassandra 中运行 CQL 查询以进行故障排除时,您仍然需要使用下划线,因此您需要在脑海中保留两种不同的列名称表示。似乎是错误的方法。

我最终采用的方法是在 Clojure 解构映射中执行映射,如下所示:

(let [{user-key :user_key, user-name :user_name} 
    (conn/exec-1-row-ps "select user_key,user_name from users limit 1")] )

(“conn/exec-1-row-ps”是我的便利函数,它只是在映射中查找 CQL 字符串,并使用先前准备好的语句(如果存在),否则准备语句并将其隐藏在映射中,并且然后执行准备好的语句并返回结果集的第一行,如果返回多行则抛出异常)。

如果我使用更简洁的 {:keys []} 解构方法,那么我会在 Clojure 变量名中使用下划线:
(let [{:keys [user_key user_name]} ...

这是我尝试的第一种方法,但它变得非常难看,因为带下划线的变量名渗透到代码中,并与带破折号的变量名正面交锋。令人困惑。

长期面对这个问题,在解构映射中进行转换,其中Clojure“variable-name”和Cassandra“column_name”并排,感觉是最好的解决方案。它还允许我在需要时将 short_col_nms 扩展为更具描述性的变量名称。

这与 Clojure 将文件名中的下划线映射到命名空间中的破折号有一些相似之处,因此感觉像这样进行映射有一些先例。在文件名/命名空间的情况下,Clojure 会自动进行映射,因此直接模拟可能是 {:keys []} 解构的一个版本,将破折号映射到下划线。

我是 Clojure 的相对新手,所以我意识到可能有更好的方法来做到这一点。因此我的问题。

我考虑过的一项改进是编写一个宏,在编译时动态构建解构映射。但我不知道如何编写一个在编译过程早期运行的宏。

最佳答案

camel-snake-kebab对这些类型的转换有一个漂亮干净的界面。

从示例中:

(use 'camel-snake-kebab)

(->CamelCase 'flux-capacitor)
; => 'FluxCapacitor

(->SNAKE_CASE "I am constant")
; => "I_AM_CONSTANT"

(->kebab-case :object_id)
; => :object-id

(->HTTP-Header-Case "x-ssl-cipher")
; => "X-SSL-Cipher"

关于macros - database_column_names 的 clojure-variable-names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20243562/

相关文章:

visual-studio-2008 - 如何从命令行从Visual Studio解决方案获取最新信息?

clojure - 如何从 Clojure 中的序列中删除项目?

hadoop - 具有紧凑存储选项的 Cassandra/Hadoop。为什么需要它,是否可以将它添加到现有表/cf

c - 是否可以定义 const 值并要求用户输入它?

ms-access - 在无人值守的 Server 2008 R2 任务计划程序上 Access 2010 宏

c - 如何根据参数编号创建具有不同行为的宏?

Clojure:懒惰 + core.logic:无限循环

Clojure: "thread-first"宏 -> 和 "thread-last"宏 ->

cassandra - 在 Cassandra 中,为什么不允许从使用紧凑存储定义的表中删除列?

cassandra - Cassandra的最佳JVM设置