Подтвердить что ты не робот

Clojure/JDBC/Postgresql: Я пытаюсь обновить значение timestamp в postgresql из строки, получив ошибку

Использование библиотеки clojure jdbc с postgresql. У меня есть таблица "xxx" с столбцом timestamp "created_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 требует значения timestamp, но как я могу преобразовать свое строковое представление даты во что-то postgres? java.util.Date также не работает, и я не могу найти никаких документов в библиотеке postgres clojure.

Спасибо!

4b9b3361

Ответ 1

Вам нужно передать экземпляр java.sql.Timestamp. Чтобы проанализировать вашу строку в одном, используя clj-time, Joda-Time -wrapping для 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.

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

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

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