除非使用Leiningen REPL,否则Clojure jdbc create-table语句不会运行

Jon*_*han 8 clojure hsqldb leiningen

我有一个小的Clojure程序,它使用Clojure JDBC工具在HSQL数据库中创建一个表.但是,如果我从Leiningen的REPL运行它,它似乎只是实际创建表.如果我使用lein runIDE或从我的IDE(IntelliJ)运行代码,它不会创建表.没有例外报道.在这两种情况下,输出只是"(0)".

这是代码片段:

(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)"]))))
Run Code Online (Sandbox Code Playgroud)

因为我正在使用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)
Run Code Online (Sandbox Code Playgroud)

如果我做:

$ lein repl

tramway.core=> (-main)
(0)
nil
Run Code Online (Sandbox Code Playgroud)

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

但是,如果我这样做:

$ rm -rf /tmp/tramway.*
$ lein run
(0)
Run Code Online (Sandbox Code Playgroud)

然后检查相同的文件,它是空的.它创造.log,.properties.script文件.除.log文件外都有内容; 没有关于CREATE TABLE已经运行的记录.

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

我也尝试将表创建从-main函数中取出并通过我的IDE运行它作为脚本,我仍然得到相同的错误结果.

fre*_*edt 7

这是一个常见的HSQLDB配置问题.

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

:subname "file:/tmp/tramwaydb;hsqldb.write_delay=false"
Run Code Online (Sandbox Code Playgroud)

要么

:subname "file:/tmp/tramwaydb;shutdown=true"
Run Code Online (Sandbox Code Playgroud)

请参阅此处的各种选项:http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html