Я работаю над программой, которая преобразует файлы базы данных питания USDA из ASCII в базу данных sqlite. Информацию об этих файлах можно найти по адресу http://www.ars.usda.gov/Services/docs.htm?docid=8964, что составляет нечто действительно потрясающее.
Однако в приведенном ниже коде мое sql-соединение «исчезает», как только я ввожу конструкцию for в функцию, которая выполняет преобразования.
(defn sanitize-field [field]
(cond
(= field "~~") ""
(= field "") 0
(and (.startsWith field "~") (.endsWith field "~"))
(.substring field 1 (- (.length field) 1))
:default (try
(Double. field)
(catch NumberFormatException n 0.0))))
(defn field-separator [line]
(.split line "\\^"))
(defn parse-file [file]
(map (fn [l] (map sanitize-field (field-separator l)))
(.split (slurp (.getCanonicalPath file)) "\r\n")))
(defn convert-food-description [source-dir]
(println (sql/connection))
(for [entry (parse-file (File. source-dir "FOOD_DES.txt"))]
(do
(println entry)
(println (sql/connection))
(sql/insert-rows "food_des" entry))))
(Class/forName "org.sqlite.JDBC")
(def db {:classname "com.sqlite.JDBC" :subprotocol "sqlite" :subname "nutrition.sqlite"})
(defn convert []
(sql/with-connection db
(convert-food-description (File. "/home/savanni/Downloads/nutrient_database"))))
Когда я запускаю операцию преобразования, вот что я получаю:
user=> (convert)
(convert)
#<Conn org.sqlite.Conn@180e426>
((01001 0100 Butter, salted BUTTER,WITH SALT Y 0.0 6.38 4.27 8.79 3.87)
java.lang.Exception: no current database connection
Итак, мои единственные команды println находятся в convert-food-description. Похоже, что первое сразу после запуска функции выполняется нормально, распечатывая соединение, которое я создал с помощью оператора with-connection. Но затем начинается цикл for, я распечатываю первую строку данных, которую я собираюсь вставить в базу данных, а затем выдает исключение при попытке снова напечатать соединение SQL.
Что может быть причиной того, что соединение там исчезает? Что-то еще происходит?
ОБНОВЛЕНИЕ: все sql / функции здесь взяты из clojure.contrib.sql