为什么它需要在我的列名周围加引号



在macos上运行时,使用模块github.com/lib/pq处理postgres数据库连接和命令。

JSON文件(post.JSON(:

{
"Title":"thistitle",
"Desc":"thisdesc",
"Content":"thiscontent",
"PageNum":123
}

果朗REST API函数:


func (server *Server) createNewArticle(w http.ResponseWriter, r *http.Request) {
var article &Article
err := json.NewDecoder(r.Body).Decode(&article)
_, err = server.Database.Exec(`INSERT INTO articles ("title", "desc", "content", "pagenum") values ($1, $2, $3, $4)`, article.Title, article.Desc, article.Content, article.PageNum)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
log.Fatal(err.Error())
}
}
curl -i -X POST -H 'Content-Type: application/json' -d @post.json http://<IP>:<PORT>/<ENDPOINT>

在执行SQL命令的go函数中,pq会抱怨,除非我在命令中的列名周围加引号(…articles("title",…((,并且不会插入数据库,后面跟着错误pq: syntax error at or near "desc"。在普通的SQL命令中,这些引号是不必要的。

我在网上看到过使用未加引号的列名的例子。

为什么我的代码需要这些额外的报价?它是pq的一部分吗?

DESC是一个保留的PostgreSQL关键字。根据链接文档:

标记为"保留"的标记是不允许作为列或表名的标记

一般来说,如果您在包含任何列出的关键字作为标识符的命令中遇到虚假的语法分析器错误,您应该尝试引用标识符,看看问题是否消失。

您只需要在DESC周围加引号,因为它是一个保留关键字-这是PostgreSQL中的一个错误,无论您如何运行查询都会发生(请参阅此DB Fiddle(。

最新更新