Clojure / JDBC / Postgresql: я пытаюсь обновить значение метки времени в postgresql из строки, получая ошибку - PullRequest
14 голосов
/ 16 февраля 2012

Использование библиотеки jjdbc clojure с postgresql. У меня есть таблица «xxx» со столбцом метки времени «create_at» в postgresql, и у меня есть строка, содержащая дату в правильном формате. Не удается выполнить вставку:

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

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

Вот ошибка:

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

Итак, я понимаю, что postgres требует значения метки времени, но как мне преобразовать мое строковое представление даты во что-то, что postgres примет? Сбой java.util.Date, и я не могу найти никаких документов в библиотеке clojure postgres.

Спасибо!

1 Ответ

16 голосов
/ 16 февраля 2012

Вам нужно будет передать java.sql.Timestamp экземпляр. Чтобы разобрать вашу строку в одну, используя clj-time, библиотеку Joda-Time для Clojure, вы должны сделать что-то вроде следующего:

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

Возвращенное значение затем может быть передано в PostgreSQL через JDBC.

В случае, если вы получаете дату в каком-либо другом строковом формате и конвертируете ее в этот формат, вы можете пропустить конвертацию и предоставить соответствующий форматер для исходного представления. По умолчанию на карте clj-time.format/formatters доступно довольно много, скажем, (clj-time.format/show-formatters) в REPL, чтобы увидеть список с примерами. Кроме того, clj-time.coerce/from-string пытается все форматеры по умолчанию в последовательности, возвращая значение первого последующего анализа (nil, если его нет). Если вы получаете дату как java.util.Date или long, см. from-date и from-long в том же пространстве имен.

Используйте [clj-time "0.3.6"] в качестве спецификатора зависимости в project.clj, если вы решите использовать clj-time.

В качестве альтернативы, вы можете использовать какой-то другой способ разбора вашей строки метки времени в java.sql.Timestamp; Timestamp сам может проанализировать другое строковое представление:

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

clj-time - самый разумный способ иметь дело с датой и временем в Clojure, поэтому, вероятно, он того стоит.

...