Go 操作 Postgresql 使用 upsert 报语法错误

2019-05-05 11:00:47 +08:00
 imherer
* SQL 语句:``INSERT INTO rank VALUES($1,$2,$3) ON CONFLICT (uid) DO UPDATE SET total=rank.total+1``
* 报错信息:``pq: syntax error at or near "ON CONFLICT "``
* 用的 pg 库:``github.com/lib/pq``
* ``go version``:1.11.2
* ``Postgresql version``:10.5

把$1,$2,$3 换成具体的值然后直接执行这个条 SQL 语句是没问题的
难道是 pg 库不支持 upsert 语法吗?
2191 次点击
所在节点    Go 编程语言
4 条回复
praynise
2019-05-06 17:04:47 +08:00
好使啊,以下是我测试的代码,可以正常执行

package main

import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)

func main() {
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
"localhost", 5432, "postgres", "postgres", "postgres")
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
panic(err)
}
defer db.Close()

err = db.Ping()
if err != nil {
panic(err)
}
sql := "insert into testupsert values ($1,$2,$3) on conflict (uid) do update set total=testupsert.total+1,what = EXCLUDED.what"
_,err = db.Exec(sql,1,3,3)
if err != nil{
panic(err)
}
}
imherer
2019-05-07 10:23:29 +08:00
@praynise 谢谢。 我是先 Prepare 然后在 Exec 的。我直接 Exec 试试。

你这里的 EXCLUDED 是啥?
imherer
2019-05-07 10:39:59 +08:00
@praynise 我靠,好诡异啊。 之前那个函数我注释了。 现在直接执行有好使了。。。。
praynise
2019-05-07 10:58:33 +08:00
EXCLUDED 代表从外部来的,就是你 value 中的值。在我的例子中,EXCLUDED.what 代表就是$3。我忘了付上我得表结构了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/561029

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX