2012-04-19 76 views
7

我已经得到了使用Clojure JDBC工具在HSQL数据库中创建一个表一个小的Clojure程序。但是,如果我从Leiningen的REPL运行它,它似乎只能创建表。如果我使用lein run或从我的IDE(IntelliJ)运行代码,它不创建表。没有例外报道。在这两种情况下,输出只是“(0)”。Clojure的JDBC创建表的语句不运行,除非使用Leiningen REPL

下面的代码片段:

(ns tramway.core 
    (:require [clojure.java.io :as io] 
      [clojure.java.jdbc :as sql])) 

(def hsql-db {:subprotocol "hsqldb" 
       :subname "file:/tmp/tramwaydb" 
       :user "SA" 
       :password ""}) 

(defn -main [] 
    (println (sql/with-connection hsql-db (sql/create-table 
           :footfall 
           [:id "INTEGER" "GENERATED ALWAYS AS IDENTITY(START WITH 1)"] 
           [:sample_date "DATE"] 
           [:exhibition "varchar(255)"])))) 

而且因为我使用Leiningen,这是我project.clj

(defproject tramway "1.0.0-SNAPSHOT" 
    :description "Description here" 
    :dependencies [[org.clojure/clojure "1.3.0"] 
       [org.clojure/java.jdbc "0.1.4"] 
       [org.hsqldb/hsqldb "2.2.8"]] 
    :main tramway.core) 

如果我做的:

$ lein repl 

tramway.core=> (-main) 
(0) 
nil 

,然后检查/tmp/tramway.log我可以看到CREATE TABLE成功执行。

但是,如果我这样做:

$ rm -rf /tmp/tramway.* 
$ lein run 
(0) 

,然后检查同一个文件,它是空的。它确实创建.log.properties.script文件。除了.log文件以外的所有文件都有内容;没有运行CREATE TABLE的记录。

我在做什么错?无论我从REPL运行我的(-main)函数,还是让Leiningen自动运行它,我都希望得到相同的结果。

我也曾尝试采取表创建了-main功能和运行它只是通过我的IDE的脚本,我仍然得到同样的不良后果。

回答

7

这是一个常见HSQLDB配置问题。

HSQLDB的默认配置不用于测试用途。因此,它会延迟写入和同步.log条目500毫秒,并且在连接关闭时不会关闭数据库。试试下面的这些设置在您的网址:

:subname "file:/tmp/tramwaydb;hsqldb.write_delay=false" 

:subname "file:/tmp/tramwaydb;shutdown=true" 

见的各种选项在这里:http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

+0

这做到了。谢谢!这是我第一次进入HSQLDB和Clojure,所以我不知道从哪里开始。希望我能更多地赞扬你! – Jonathan 2012-04-20 11:02:49