如何使用 clojure.java.jdbc UPSERT

问题描述

我使用插入多!在 clojure.java.jdbc 中将多行插入到 Postgresql 表中。出于某种原因,我在要插入的行中得到了重复的主键。这些必须被忽略,其余的必须正常插入。所以我需要使用 ON CONFLICT DO nothing 语法“更新插入”。这是如何使用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 helpers 一起使用以使用 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"]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...