2012-04-19 4 views
7

Ich habe ein kleines Clojure-Programm, das die Clojure JDBC Tools verwendet, um eine Tabelle in einer HSQL-Datenbank zu erstellen. Es scheint aber nur die Tabelle zu erstellen, wenn ich sie von Leiningens REPL aus laufe. Es erstellt die Tabelle nicht, wenn ich den Code unter Verwendung lein run oder von meiner IDE (IntelliJ) ausführe. Es gibt keine Ausnahmen. In beiden Fällen ist die Ausgabe nur "(0)".Clojure jdbc create-table-Anweisung wird nicht ausgeführt, wenn Leiningen REPL

Hier ist der Code-Schnipsel:

(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)"])))) 

Und da ich Leiningen bin mit, hier ist mein 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) 

Wenn ich tun:

$ lein repl 

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

und dann überprüfen /tmp/tramway.log Ich kann die CREATE TABLE erfolgreich ausgeführt sehen.

Allerdings, wenn ich tun:

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

und dann die gleiche Datei überprüfen, ist es leer. Es erstellt die .log, .properties und .script Dateien erstellen. Alle außer der .log Datei haben Inhalt; Es gibt einfach keine Aufzeichnung der CREATE TABLE ausgeführt wurde.

Was mache ich falsch? Ich würde erwarten, das gleiche Ergebnis zu haben, egal ob ich meine (-main) -Funktion von der REPL aus führe oder Leiningen es automatisch ausführen lasse.

Ich habe auch versucht, die Tabellenerstellung aus der -main-Funktion und läuft es nur als Skript über meine IDE, und ich bekomme immer noch das gleiche schlechte Ergebnis.

Antwort

7

Dies ist eine allgemeine HSQLDB-Konfigurationsfrage.

Die Standardkonfiguration von HSQLDB ist nicht für die Testverwendung vorgesehen. Als Ergebnis verzögert es das Schreiben und Synchronisieren der .log-Einträge um 500 Millisekunden, und es beendet die Datenbank nicht, wenn die Verbindung geschlossen wird. Versuchen Sie eine dieser Einstellungen in Ihrer URL:

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

oder

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

die verschiedenen Option Siehe hier: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

+0

Das tat es. Vielen Dank! Es ist mein erster Ausflug in HSQLDB und auch Clojure, also wusste ich nicht wo ich anfangen soll. Ich wünschte, ich könnte dich mehr aufrüsten! – Jonathan

Verwandte Themen