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

Golang Go语言中操作 Postgresql 使用 upsert 报语法错误
* 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 库:<a target="_blank" href="http://github.com/lib/pq" rel="nofollow">github.com/lib/pq</a>
* go version:1.11.2
* Postgresql version:10.5

把$1,$2,$3 换成具体的值然后直接执行这个条 SQL 语句是没问题的
难道是 pg 库不支持 upsert 语法吗?


更多关于Golang Go语言中操作 Postgresql 使用 upsert 报语法错误的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

好使啊,以下是我测试的代码,可以正常执行

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)
}
}

更多关于Golang Go语言中操作 Postgresql 使用 upsert 报语法错误的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


谢谢。 我是先 Prepare 然后在 Exec 的。我直接 Exec 试试。

你这里的 EXCLUDED 是啥?

我靠,好诡异啊。 之前那个函数我注释了。 现在直接执行有好使了。。。。

EXCLUDED 代表从外部来的,就是你 value 中的值。在我的例子中,EXCLUDED.what 代表就是$3。我忘了付上我得表结构了

在Go语言中操作PostgreSQL数据库时,如果你在使用UPSERT(即INSERT ... ON CONFLICT ... DO UPDATE)语句时遇到语法错误,这通常是由于几个常见原因造成的。以下是一些检查和修正的建议:

  1. SQL语法检查:确保你的UPSERT语句遵循PostgreSQL的正确语法。例如:

    INSERT INTO tablename (column1, column2)
    VALUES (value1, value2)
    ON CONFLICT (conflict_target)
    DO UPDATE SET column1 = EXCLUDED.column1, column2 = EXCLUDED.column2;
    

    确保conflict_target是表中的唯一索引或主键。

  2. Go代码中的SQL拼接:如果你是通过字符串拼接构建SQL语句,确保所有变量和占位符都被正确处理和引用。使用参数化查询可以防止SQL注入攻击,并确保数据类型正确。

  3. 驱动和库的支持:确保你使用的Go驱动(如pq)支持PostgreSQL的ON CONFLICT子句。大多数现代驱动应该都支持,但总是好的习惯查看最新的文档。

  4. PostgreSQL版本ON CONFLICT是在PostgreSQL 9.5中引入的。如果你的数据库版本低于此,你需要升级数据库或使用其他方法(如先尝试插入,捕获冲突,然后执行更新)。

  5. 错误日志:查看Go程序的错误输出和PostgreSQL的日志,它们通常会提供关于语法错误的更多细节。

通过上述步骤,你应该能够定位并解决UPSERT语句中的语法错误。如果问题仍然存在,请提供更具体的错误信息以便进一步分析。

回到顶部