postgresql - Clojure:带有 postgres 的 jdbc/insert 返回 1 而不是新插入的行
问题描述
调用插入的函数
(defn insert-order
[component order-num email]
(jdbc/insert! (:ds component)
:orders ["\"orderNumner\"" "email"] [order-num email] ))
我的数据库连接配置
(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/articles/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"]]
我错过了什么吗?或者我的理解是错误的
解决方案
正确的 sytnax,对于您所追求的,仅在第一个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!
推荐阅读
- asp.net-mvc - 将多个参数传递给局部视图
- nginx - 如何通过 VPN 连接到 gitlab(VPN + GITLAB)
- reactjs - 在 React Hooks 中添加扩展运算符时出错
- angular - 模板错误类型“AbstractControl”不可分配给类型“FormControl”
- c# - 在多个列表中分配非唯一元素的最有效方法
- neo4j - 不要从 Cypher 中的特定路径返回节点集
- python - Python如何从不使用扩展的视频中获取图像系列代码(YUV,RGB)
- c++ - 如何创建一个对浮点数和整数做不同事情的类专业化?
- typescript - Cordova 相机 - NATIVE_URI 已删除,无法获取 saveToPhotoAlbum 文件 uri
- python-3.x - Python3 Whatsapp + Selenium - “点击”对象不可调用