Clojure PostgreSQL JDBC执行查询时不断出错

Posted

技术标签:

【中文标题】Clojure PostgreSQL JDBC执行查询时不断出错【英文标题】:Clojure PostgreSQL JDBC keep getting error executing query 【发布时间】:2015-06-17 05:50:03 【问题描述】:

我希望有人可以帮助我,

所以我正在使用 clojure 和 postgresql 构建数据库支持的网站, 但我不断收到错误。 以下是 REPL 上的代码和错误:

(ns app.config-postgre
  (require [clojure.java.jdbc :as sql]))

(def db1
  :classname "org.postgresql.Driver"
   :subprotocol "postgresql"
   :subname "//localhost:5432/dbname"
   :username "username"
   :password "password) 
;;that's not the real username and password, the real one is right

这里是导致错误的代码:

(sql/insert! db1 :user123
             :username "user" :password "pass" :user-id "1")
;;PSQLException ERROR: syntax error at or near "user"
  Position: 43  org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl.java:2157)

(sql/execute! db1 ["INSERT INTO user123 VALUES ('\"user\", \"pass\" ,1')"])
;;PSQLException ERROR: null value in column "password" violates not-null constraint
  Detail: Failing row contains (user,pass,1, null, null).  org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl.java:2157)

(sql/execute! db1 ["INSERT INTO user123 VALUES ('\"user\",\"pass\",1')"])
;;PSQLException ERROR: malformed array literal: ""user","pass",1"
  Detail: Junk after closing right brace.
  Position: 29  org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl.java:2157)

(sql/execute! db1 ["INSERT INTO user123 VALUES ('\"user\",\"pass\",1')"])
;;PSQLException ERROR: malformed array literal: ""user","pass",1"
  Detail: Array value must start with "" or dimension information.
  Position: 29  org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl.java:2157)

(sql/execute! db1 ["INSERT INTO user123 VALUES ('user','pass',1)"])
;;PSQLException ERROR: malformed array literal: "user"
  Detail: Array value must start with "" or dimension information.
  Position: 29  org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl.java:2157)

有什么建议吗? 提前谢谢你

编辑表 user123 的架构:

CREATE TABLE user123
(
  username character varying(100)[] NOT NULL,
  password character varying(100)[] NOT NULL,
  "user-id" integer NOT NULL,
  CONSTRAINT user_pkey PRIMARY KEY ("user-id")
)

【问题讨论】:

user123 表的架构是什么? @schaueho CREATE TABLE user123(用户名字符变化(100)[] 非空,密码字符变化(100)[]非空,“用户 ID”整数非空,约束 user_pkey 主键( “用户 ID”)) 您的尝试在我看来是合理的,我唯一想到的是“user-id”列名可能会引起一些混乱。您是否尝试过为用户名参数使用与“user”不同的值来排除它没有在“user-id”上吐槽?否则,请尝试指定 postgresql 驱动程序的 loglevel 属性,也许这会给您更多信息。请参阅sql/get-connection 上的文档,这应该可以通过 DriverManager 方法实现。 我不是数据库专家,但在我看来,您将 username 指定为可变(但有界)长度字符串的数组 - 您可能,除非您打算拥有多个用户每行的名称,并不意味着这个。我会从定义中删除[],然后再试一次。与密码相同。 【参考方案1】:

(sql/execute! db1 ["INSERT INTO user123 VALUES (?, ?, ?)" "user" "pass" 1]) 用于您的目的

【讨论】:

【参考方案2】:
(sql/execute! db1 ["INSERT INTO user123 VALUES ('user', 'pass', 1);"])

【讨论】:

【参考方案3】:

我认为您应该在您的数据库规范中将 :username 更改为 :user

【讨论】:

以上是关于Clojure PostgreSQL JDBC执行查询时不断出错的主要内容,如果未能解决你的问题,请参考以下文章

如何做批处理 jdbc/insert!和 jdbc/更新!在 Clojure 中使用 postgresql?

Metabase/Clojure 错误:不可冻结类型:类 org.postgresql.jdbc.PgArray

通过Clojure和JDBC将5,000,000行移动到另一个Postgresql DB

clojure连接postgres

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

Clojure jdbc 创建复合主键