我想使用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循环失败?
答案 0 :(得分:8)
for
很懒。请改用doseq
:
(doseq [sql sqls]
(k/exec-raw sql))
答案 1 :(得分:4)
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
的工作速度更快。