我想使用SQLKorma执行一些SQL语句。首先,我编写了以下代码:
(let [sqls (-> (slurp "resources/database.sql")
(str/split #";")
butlast)]
(for [sql sqls]
(k/exec-raw sql)))但由于未知的原因,这不起作用。for循环被完全跳过。然而,这是可行的:
(let [sqls (-> (slurp "resources/database.sql")
(str/split #";")
butlast)]
(loop [sqls sqls]
(if (not (empty? sqls))
(do
(k/exec-raw (first sqls))
(recur (rest sqls))))))这一切为什么要发生?为什么for循环失败?
发布于 2013-07-08 18:37:26
for创建了一个惰性序列。只有当您以某种方式实际使用延迟序列的每个元素时,Clojure才会执行它。如果您只需要副作用,那么您应该使用dorun强制执行惰性序列。
在您的情况下,我建议您使用map
(->> (str/split (slurp "resources/database.sql")
#";")
butlast
(map k/exec-raw)
dorun)或者doseq (see mtyaka's answer)而不是for循环
(doseq [sql (-> (slurp "resources/database.sql")
(str/split #";")
butlast)]
(k/exec-raw sql))我更喜欢map版本,但是doseq的运行速度要快一点。
发布于 2013-07-08 17:07:52
for很懒。请改用doseq:
(doseq [sql sqls]
(k/exec-raw sql))https://stackoverflow.com/questions/17522682
复制相似问题