3

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 ループが失敗するのはなぜですか?

4

2 に答える 2

4

for遅延シーケンスを作成します。Clojure は、遅延シーケンスの各要素を実際に使用する場合にのみ実行します。副作用だけが必要な場合は、 を使用して遅延シーケンスの実行を強制する必要がありますdorun

あなたの場合、使用することをお勧めしますmap

(->> (str/split (slurp "resources/database.sql")
                #";")
     butlast
     (map k/exec-raw)
     dorun)

またはdoseqmtyakaの回答を参照for)ループの代わりに

(doseq [sql (-> (slurp "resources/database.sql")
                (str/split #";")
                butlast)]
  (k/exec-raw sql))

mapバージョンの方が好きですがdoseq、少し速く動作します。

于 2013-07-08T10:37:26.057 に答える