2012-04-19 11 views
7

Tengo un pequeño programa Clojure que usa las herramientas Clojure JDBC para crear una tabla en una base de datos HSQL. Sin embargo, solo parece crear realmente la tabla si la ejecuto desde REPL de Leiningen. No crea la tabla si ejecuto el código usando lein run o desde mi IDE (IntelliJ). No hay excepciones reportadas En ambos casos, la salida es solo "(0)".Clojure jdbc create-table statement no se ejecuta a menos que use Leiningen REPL

He aquí el fragmento de código:

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

Y ya que estoy usando Leiningen, aquí está mi 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) 

Si hago:

$ lein repl 

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

y después comprobar /tmp/tramway.log Veo que el CREATE TABLE se ejecutó correctamente.

Sin embargo, si lo hago:

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

y compruebe el mismo archivo, que está vacío. Es hace crear los archivos .log, .properties y .script. Todos menos el archivo .log tienen contenido; simplemente no hay registro de que se haya ejecutado el CREATE TABLE.

¿Qué estoy haciendo mal? Esperaría tener el mismo resultado si ejecuto mi función (principal) desde REPL o hago que Leiningen la ejecute automáticamente.

También intenté eliminar la creación de la tabla de la función -main y ejecutarla solo como una secuencia de comandos a través de mi IDE, y sigo teniendo el mismo mal resultado.

Respuesta

7

Esta es una pregunta de configuración común de HSQLDB.

La configuración predeterminada de HSQLDB no está destinada al uso de pruebas. Como resultado, retrasa la escritura y la sincronización de las entradas .log en 500 milisegundos y no cierra la base de datos cuando se cierra la conexión. Prueba cualquiera de estos ajustes en su URL:

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

o

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

Véanse los distintos opción aquí: http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

+0

que lo hizo. ¡Gracias! Es mi primera incursión en HSQLDB y también en Clojure, así que no sabía por dónde empezar. ¡Ojalá pudiera votarte más! – Jonathan

Cuestiones relacionadas