2012-02-16 19 views
13

Sử dụng thư viện jjc clojure với postgresql. Tôi có một bảng "xxx" với một cột dấu thời gian "created_at" trong postgresql, và tôi có một chuỗi có chứa một ngày ở định dạng đúng. Làm một chèn thất bại:Clojure/JDBC/Postgresql: Tôi đang cố gắng cập nhật giá trị dấu thời gian trong postgresql từ một chuỗi, nhận được lỗi

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

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

Dưới đây là lỗi:

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

Vì vậy, tôi hiểu rằng postgres đòi hỏi một giá trị dấu thời gian, nhưng làm thế nào để chuyển đổi chuỗi đại diện của tôi kể từ ngày thành một cái gì postgres sẽ chấp nhận ? java.util.Date cũng không thành công và tôi không thể tìm thấy bất kỳ tài liệu nào trên thư viện clojure postgres.

Cảm ơn!

Trả lời

15

Bạn sẽ cần phải vượt qua một phiên bản java.sql.Timestamp. Để phân tích chuỗi của bạn vào một sử dụng clj-time, một Joda-Time -wrapping thư viện cho Clojure, bạn muốn làm điều gì đó dọc theo dòng sau đây:

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

Giá trị trả lại sau đó có thể được chuyển tới PostgreSQL qua JDBC.

Trong trường hợp bạn có được ngày ở một số định dạng chuỗi khác và chuyển đổi nó sang định dạng này, bạn có thể bỏ qua chuyển đổi và cung cấp trình định dạng phù hợp cho bản trình bày gốc. Có một số ít có sẵn theo mặc định trong bản đồ clj-time.format/formatters, giả sử (clj-time.format/show-formatters) tại REPL để xem danh sách có các ví dụ. Ngoài ra, clj-time.coerce/from-string thử tất cả các trình định dạng mặc định theo thứ tự trả lại giá trị của phân tích cú pháp thành công đầu tiên (nil nếu không có). Nếu bạn có được ngày tháng là java.util.Date hoặc long, hãy xem from-datefrom-long trong cùng một không gian tên.

Sử dụng [clj-time "0.3.6"] làm thông số phụ thuộc trong số project.clj nếu bạn quyết định sử dụng clj-time.

Hoặc, bạn có thể sử dụng một số cách khác để phân tích chuỗi dấu thời gian của bạn thành một java.sql.Timestamp; Timestamp chính nó có thể phân tích một chuỗi đại diện khác nhau:

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

clj-time là cách lành mạnh nhất để đối phó với ngày và thời gian trong Clojure Mặc dù vậy, do đó, nó có thể sẽ là giá trị trong khi của bạn.

+0

clj-time thực sự là cách để xử lý thời gian trong Clojure, cảm ơn nhiều! – prismofeverything

Các vấn đề liên quan