2012-02-16 4 views
13

Utilizzo della libreria jdbc clojure con postgresql. Ho una tabella "xxx" con una colonna timestamp "created_at" in postgresql, e ho una stringa contenente una data nel giusto formato. Facendo un inserimento non riesce:Clojure/JDBC/Postgresql: Sto cercando di aggiornare un valore di timestamp in postgresql da una stringa, ottenendo un errore

(require '[clojure.java.jdbc :as sql]) 

(sql/with-connection *db* 
    (sql/insert-record :xxx {:created_at "Thu Feb 09 10:38:01 +0000 2012"})) 

Ecco l'errore:

org.postgresql.util.PSQLException: ERROR: column "created_at" 
is of type timestamp with time zone but expression is of type character varying 

così ho capito che postgres richiede un valore timestamp, ma come faccio a convertire il mio rappresentazione di stringa di data in qualcosa Postgres accetterà ? java.util.Date ha esito negativo anche se non riesco a trovare alcun documento sulla libreria di clojure postgres.

Grazie!

risposta

15

È necessario passare in un'istanza java.sql.Timestamp. Per analizzare la stringa in un unico utilizzando clj-time, una biblioteca -wrapping Joda-Time per Clojure, devi fare qualcosa secondo le seguenti linee:

(require '(clj-time [format :as timef] [coerce :as timec]) 

(->> "Thu Feb 09 10:38:01 +0000 2012" 
    (timef/parse (timef/formatter "EEE MMM dd HH:mm:ss Z yyyy")) 
    timec/to-timestamp) 

Il valore restituito può quindi essere passato a PostgreSQL tramite JDBC.

Nel caso in cui si ottenga la data in un altro formato di stringa e la si converta in questa, è possibile saltare la conversione e fornire un formattatore appropriato per la rappresentazione originale. Ce ne sono alcuni disponibili per impostazione predefinita nella mappa clj-time.format/formatters, ad esempio (clj-time.format/show-formatters) al REPL per visualizzare un elenco con esempi. Inoltre, clj-time.coerce/from-string tenta tutti i formattatori predefiniti in sequenza restituendo il valore della prima analisi successiva (nil se non ce ne sono). Se stai ottenendo la data come java.util.Date o long, vedi from-date e from-long nello stesso spazio dei nomi.

Utilizzare lo [clj-time "0.3.6"] come identificatore di dipendenza nello project.clj se si decide di utilizzare clj-time.

In alternativa, è possibile utilizzare un altro modo di analizzare la stringa di data/ora in un java.sql.Timestamp; Timestamp si può analizzare una rappresentazione di stringa diversa:

(java.sql.Timestamp/valueOf "2004-10-19 10:23:54") 

clj-time è il modo più sano di trattare con data e ora in Clojure, però, quindi è probabile che sia vale la pena.

+0

clj-time è davvero il modo di gestire il tempo in Clojure, grazie mille! – prismofeverything