2012-04-19 15 views
7

Clojure JDBCツールを使用してHSQLデータベースにテーブルを作成する小さなClojureプログラムがあります。しかし、私がLeiningenのREPLから実行すると、実際にテーブルを作成するように見えるだけです。 lein runまたはIDE(IntelliJ)を使用してコードを実行すると、テーブルが作成されません。例外は報告されていません。両方の場合、出力はちょうど "(0)"です。Clojure jdbc create-table文が実行されない限り、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ミリ秒遅らせ、接続が閉じられるとデータベースをシャットダウンしません。あなたのURLでこれらの設定のいずれかを試してみてください。

: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

関連する問題