登录
首页 >  Golang >  Go问答

为什么要在数据库中使用引号来命名列?

来源:stackoverflow

时间:2024-03-26 11:09:36 427浏览 收藏

在 PostgreSQL 数据库中使用 lib/pq 模块处理连接和命令时,需要在列名周围加上引号。这是因为在 Go 代码中执行 SQL 命令时,pq 模块要求对列名进行转义,以避免与保留关键字(如 DESC)混淆。如果未添加引号,PQ 会将列名解析为关键字,从而导致语法错误并阻止插入操作。

问题内容

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

json 文件(post.json):

{
    "title":"thistitle",
    "desc":"thisdesc",
    "content":"thiscontent",
    "pagenum":123
}

golang 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://:/

在执行 sql 命令的 go 函数内,pq 会抱怨,除非我在命令内的列名周围加上引号 (...articles("title", ...)),并且不会插入到数据库中,然后错误 pq: “desc” 处或附近的语法错误。在普通的 sql 命令中,这些引号不是必需的。

我在网上看到过使用不带引号的列名称的示例。

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


解决方案


DESCreserved PostgreSQL keyword。根据链接文档:

标记为“保留”的是那些不允许作为列名或表名的标记

作为一般规则,如果您收到包含任何列出的关键字作为标识符的命令的虚假解析器错误,您应该尝试引用该标识符以查看问题是否消失。

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

到这里,我们也就讲完了《为什么要在数据库中使用引号来命名列?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>