V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
imherer
V2EX  ›  Go 编程语言

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

  •  
  •   imherer · 2019-05-05 11:00:47 +08:00 · 2296 次点击
    这是一个创建于 2047 天前的主题,其中的信息可能已经有所发展或是发生改变。
    * 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 语法吗?
    4 条回复    2019-05-07 10:58:33 +08:00
    praynise
        1
    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
        2
    imherer  
    OP
       2019-05-07 10:23:29 +08:00
    @praynise 谢谢。 我是先 Prepare 然后在 Exec 的。我直接 Exec 试试。

    你这里的 EXCLUDED 是啥?
    imherer
        3
    imherer  
    OP
       2019-05-07 10:39:59 +08:00
    @praynise 我靠,好诡异啊。 之前那个函数我注释了。 现在直接执行有好使了。。。。
    praynise
        4
    praynise  
       2019-05-07 10:58:33 +08:00
    EXCLUDED 代表从外部来的,就是你 value 中的值。在我的例子中,EXCLUDED.what 代表就是$3。我忘了付上我得表结构了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1151 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:45 · PVG 07:45 · LAX 15:45 · JFK 18:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.