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
好使啊,以下是我测试的代码,可以正常执行
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
)语句时遇到语法错误,这通常是由于几个常见原因造成的。以下是一些检查和修正的建议:
-
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
是表中的唯一索引或主键。 -
Go代码中的SQL拼接:如果你是通过字符串拼接构建SQL语句,确保所有变量和占位符都被正确处理和引用。使用参数化查询可以防止SQL注入攻击,并确保数据类型正确。
-
驱动和库的支持:确保你使用的Go驱动(如
pq
)支持PostgreSQL的ON CONFLICT
子句。大多数现代驱动应该都支持,但总是好的习惯查看最新的文档。 -
PostgreSQL版本:
ON CONFLICT
是在PostgreSQL 9.5中引入的。如果你的数据库版本低于此,你需要升级数据库或使用其他方法(如先尝试插入,捕获冲突,然后执行更新)。 -
错误日志:查看Go程序的错误输出和PostgreSQL的日志,它们通常会提供关于语法错误的更多细节。
通过上述步骤,你应该能够定位并解决UPSERT
语句中的语法错误。如果问题仍然存在,请提供更具体的错误信息以便进一步分析。