Clojure: jdbc / insert с postgres возвращает 1 вместо недавно вставленной строки - PullRequest
0 голосов
/ 17 декабря 2018

Функция, которая вызывает вставку

 (defn insert-order
   [component order-num email]
     (jdbc/insert! (:ds  component)
         :orders ["\"orderNumner\""  "email"] [order-num email] ))

Моя связь с базой данных conf

(defn ^:private pooled-data-source
  [host dbname user password port]
  {:datasource
   (doto (ComboPooledDataSource.)
     (.setDriverClass "org.postgresql.Driver" )
     (.setJdbcUrl (str "jdbc:postgresql://" host ":" port "/" dbname))
     (.setUser user)
     (.setPassword password))})

Когда я вызываю (insert-order) => (1), мне нужна только что вставленная строка.

В соответствии с http://clojure -doc.org / article / ecosystem / java_jdbc / using_sql.html возвращает только что созданную строку.

Мой проект зависит от:

:dependencies [[org.clojure/clojure "1.9.0"]
                 [com.stuartsierra/component "0.3.2"]
                 [com.walmartlabs/lacinia "0.30.0"]
                 [com.walmartlabs/lacinia-pedestal "0.10.0"]
                 [org.clojure/java.jdbc "0.7.8"]
                 [org.postgresql/postgresql "42.2.5.jre7"]
                 [com.mchange/c3p0 "0.9.5.2"]
                 [io.aviso/logging "0.3.1"]]

Я что-то упустил?Или мое понимание неверно

1 Ответ

0 голосов
/ 17 декабря 2018

Правильный синтаксис для того, что вам нужно, упоминается только в тексте над первым insert! примером, но затем не используется.

... если ваша база данных / драйвер поддерживает это, вы можете передать :return-keys в качестве опции, чтобы вернуть сгенерированные ключи.Начиная с java.jdbc 0.7.6, это может быть вектор возвращаемых имен столбцов (для драйверов, поддерживающих это) или простой логический тип.

Так что синтаксис для получения того, что вы хотите, это:

; create a sample table with timestamp and sequence id
(jdbc/db-do-commands db-spec ["CREATE TABLE test (
                                 id SERIAL, 
                                 ts TIMESTAMP DEFAULT 'now()', 
                                 name TEXT)"])
; Use `:return-keys` to get the actual generated ids 
; and pass it the columns you are after
(jdbc/insert! db-spec :test {:name "Test 1"} {:return-keys ["id" "ts" "name"]})
; => ({:id 3, :ts #inst "2018-12-17T13:19:57.544067000-00:00", :name "Test 1"})

Смешать и сопоставить с другими артериями insert!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...