如何使用clojure.java.jdbc进行UPSERT



我使用insert-multi!在clojure.java.jdbc中插入多行到Postgresql表中。由于某种原因,我在要插入的行中得到了重复的主键。这些必须被忽略,其余的必须正常插入。所以我需要"颠覆"使用ON冲突不做任何事语法。下面是如何使用clojure.java.jdbc:

(jdbc/insert-multi! db-spec :fruit
[:name :cost]
[["Pomegranate" 585] 
["Kiwifruit" 93]])

,但我实际上必须做以下操作:

INSERT INTO fruit (name, cost)
VALUES ("Pomegranate", 585), 
("Kiwifruit", 93) 
ON CONFLICT (name) DO NOTHING;

是否有解决这个问题的方法?我应该只是准备插入查询在我自己的字符串?

您可能会发现HoneySQL很有帮助,因为它支持更复杂的INSERT语句,并生成可以与jdbc/execute!一起使用的SQL字符串+参数向量:

https://cljdoc.org/d/seancorfield/honeysql/2.0.0-alpha2/doc/getting-started/postgresql-support

您可以使用HoneySQL与HoneySQL PostgreSQL助手使用upsert (ON CONFLICT DO ...):

(require '[honeysql-postgres.helpers :as sql.helpers])
(-> (insert-into :fruit)
(values [{:cost 585 :name "Pomegrenade"}
{:cost 93 :name "Kiwifruit"}])
(sql.helpers/upsert (-> (sql.helpers/on-conflict :name)
(sql.helpers/do-nothing)))
(sql.helpers/returning :*)
sql.helpers/format)
=> ["INSERT INTO distributors (cost, name) VALUES (?, ?), (?, ?) ON CONFLICT (name) DO NOTHING RETURNING *" 
585 "Pomegrenade" 
93 "Kiwifruit"]

相关内容

  • 没有找到相关文章

最新更新