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